-
Notifications
You must be signed in to change notification settings - Fork 46
TypeScript
TypeScript является строго типизированным языком, и каждая переменная и
константа в нем имеет определенный тип. При этом в отличие от javascript
мы не можем динамически изменить ранее указанный тип переменной.
Типы данных:
- Boolean: логическое значение true или false
- Number: числовое значение
- String: строки
- Array: массивы
- Tuple: кортежи
- Enum: перечисления
- Any: произвольный тип
- Null и undefined: соответствуют значениям null и undefined в javascript
- Void: отсутствие конкретного значения (обычно это возвращаемый тип функций)
- Never: отсутствие значения (обычно это возвращаемый тип функций, которые генерируют
или возвращают ошибку)
Массивы определяются с помощью выражения [] и также являются строго типизированными.
То есть если изначально массив содержит строки, то в будущем он сможет работать только
со строками.
let list: number[] = [10, 20, 30];
let colors: string[] = ["red", "green", "blue"];
Кортежи (Tuples) также, как и массивы, представляют набор элементов, для которых
уже заранее известен тип.
let userInfo: [string, number] = ["Tom", 28];
Тип enum предназначен для описания набора числовых данных с помощью строковых констант.
enum Season { Winter, Spring, Summer, Autumn };
let current: Season = Season.Summer;
Синтаксис такой же, как в JS:
let person = { name: "Tom", age: 23 };
person = { name: "Alice" };
Но из-за строгой типизации на второй строке мы получим ошибку, поскольку компилятор
после первой строки предполагает, что объект person будет иметь два свойства name и age.
Должно быть соответствие по названиям, количеству и типу свойств.
Объединения (union) не являются типом данных, но они позволяют определить переменную,
которая может хранить значение двух или более типов:
let id : number | string;
id = "1345dgg5";
id = 234;
Как и в JS осуществляется с помощью оператора typeof.
const sum: any = 123;
console.log(typeof sum === "number");
TypeScript позволяет определять псевдонимы типов с помощью ключевого слова type.
type stringOrNumberType = number | string;
let sum: stringOrNumberType = 36.6;
**Type assertion представляет модель преобразования значения переменной к ** определенному типу.
Есть две формы приведения.
Первая форма заключается в использовании угловых скобок:
let someAnyValue: any = "hello world!";
let strLength: number = (<string>someAnyValue).length;
let someUnionValue: string | number = "hello work";
strLength = (<string>someUnionValue).length
Вторая форма заключается в применении оператора as:
let someAnyValue: any = "hello world!";
let strLength: number = (someAnyValue as string).length;
let someUnionValue: string | number = "hello work";
strLength = (someUnionValue as string).length;
Поверх того, что предлагает javascript, добавляются типы параметров и тип возвращаемого
значения:
// I способ
function add(a: number, b: number): number {
return a + b;
}
// II способ
let add = function (a: number, b: number) : number {
return a + b;
}
В typescript при вызове в функцию должно передаваться ровно столько значений,
сколько в ней определено параметров.
Чтобы иметь возможность передавать различное число значений в функцию,
в TS некоторые параметры можно объявить как необязательные.
Необязательные параметры должны быть помечены вопросительным знаком ?.
Причем необязательные параметры должны идти после обязательных.
Если параметр не передан, то его значение undefined.
function getName(firstName: string, lastName?: string) {
if (lastName) {
return firstName + " " + lastName;
} else {
return firstName;
}
}
TypeScript поддерживает возможность перегрузки функций.
Мы можем определить несколько версий функции, которые будут иметь одно и то
же имя, но разные типы параметров или разное количество параметров или разные
возвращаемые типы результатов.
Для перегрузки вначале опеределяем все версии функции, которые не будут иметь
никакой логики. А потом определяем версию функции с общей сигнатурой, которая
подходит под все ранее определенные варианты. И в этой общей версии уже
определяем конкретную логику функции.
function add(x: string, y: string): string;
function add(x: number, y: number): number;
function add(x: any, y: any): any {
return x + y;
}
let result1 = add(5, 4); // 9
let result2 = add("5", "4"); // 54
Каждая функция имеет тип, как и обычные переменные.
Тип функции фактически представляет комбинацию типов параметров и типа
возвращаемого значения.
// функция
function sum (x: number, y: number): number {
return x + y;
};
// переменная такого же типа, как эта функция
let op: (x:number, y:number) => number;
Ничего нового:
let sum = (x: number, y: number) => x + y;
Одной из ключевых концепций ООП является инкапсуляция, подразумевающая
сокрытие от внешнего доступа к состоянию объекта и управление доступом
к этому состоянию. Для этого используются модификаторы доступа.
В TypeScript три модификатора: public, protected и private.
Модификатор по умолчанию - public.
Если к свойствам и методам применяется модификатор private, то к ним нельзя будет
обратиться извне при создании объекта данного класса.
Модификатор protected во многом аналогичен private - свойства и методы с
данным модификатором не видны извне, но к ним можно обратиться из
классов-наследников.
class User {
private secret: string;
protected id: string;
public name: string;
}
Модификаторы также можно устанавливать в параметрах конструктора.
При таком подходе, свойства создаются сами с нужными модификаторами.