- Notifications
You must be signed in to change notification settings - Fork 47
TypeScript
TypeScript является строго типизированным языком, и каждая переменная и
константа в нем имеет определенный тип. При этом в отличие от javascript
мы не можем динамически изменить ранее указанный тип переменной.
Типы данных:
- Boolean: логическое значение true или false
- Number: числовое значение
- String: строки
- Array: массивы
- Tuple: кортежи
- Enum: перечисления
- Any: произвольный тип
- Null и undefined: соответствуют значениям null и undefined в javascript
- Void: отсутствие конкретного значения (обычно это возвращаемый тип функций)
- Never: отсутствие значения (обычно это возвращаемый тип функций, которые генерируют
или возвращают ошибку)
Массивы определяются с помощью выражения [] и также являются строго типизированными.
То есть если изначально массив содержит строки, то в будущем он сможет работать только
со строками.
letlist: number[]=[10,20,30];letcolors: string[]=["red","green","blue"];Кортежи (Tuples) также, как и массивы, представляют набор элементов, для которых
уже заранее известен тип.
let userInfo: [string,number]=["Tom",28];Тип enum предназначен для описания набора числовых данных с помощью строковых констант.
enumSeason{Winter,Spring,Summer,Autumn};
let current: Season=Season.Summer;Синтаксис такой же, как в JS:
letperson={name: "Tom",age: 23};person={name: "Alice"};Но из-за строгой типизации на второй строке мы получим ошибку, поскольку компилятор
после первой строки предполагает, что объект person будет иметь два свойства name и age.
Должно быть соответствие по названиям, количеству и типу свойств.
Объединения (union) не являются типом данных, но они позволяют определить переменную,
которая может хранить значение двух или более типов:
let id : number | string;
id = "1345dgg5";
id = 234;
Как и в JS осуществляется с помощью оператора typeof.
constsum: any=123;console.log(typeofsum==="number");TypeScript позволяет определять псевдонимы типов с помощью ключевого слова type.
typestringOrNumberType=number|string;
let sum: stringOrNumberType=36.6;**Type assertion представляет модель преобразования значения переменной к ** определенному типу.
Есть две формы приведения.
Первая форма заключается в использовании угловых скобок:
let someAnyValue: any="hello world!";letstrLength: number=(<string>someAnyValue).length;
let someUnionValue: string | number = "hello work";
strLength = (<string>someUnionValue).lengthВторая форма заключается в применении оператора as:
let someAnyValue: any="hello world!";
let strLength: number=(someAnyValueasstring).length;
let someUnionValue: string|number="hello work";strLength=(someUnionValueasstring).length;Поверх того, что предлагает javascript, добавляются типы параметров и тип возвращаемого
значения:
// I способfunctionadd(a: number,b: number): number{returna+b;}// II способletadd=function(a: number,b: number) : number{returna+b;}В typescript при вызове в функцию должно передаваться ровно столько значений,
сколько в ней определено параметров.
Чтобы иметь возможность передавать различное число значений в функцию,
в TS некоторые параметры можно объявить как необязательные.
Необязательные параметры должны быть помечены вопросительным знаком ?.
Причем необязательные параметры должны идти после обязательных.
Если параметр не передан, то его значение undefined.
functiongetName(firstName: string,lastName?: string){if(lastName){returnfirstName+" "+lastName;}else{returnfirstName;}}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 - свойства и методы с
данным модификатором не видны извне, но к ним можно обратиться из
классов-наследников.
classUser{privatesecret: string;protectedid: string;publicname: string;}Модификаторы также можно устанавливать в параметрах конструктора.
При таком подходе, свойства создаются сами с нужными модификаторами.