Skip to content

TypeScript

Sᴛѧʀʟɪɴɢ edited this page Feb 17, 2019 · 1 revision

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

**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;
}

Модификаторы также можно устанавливать в параметрах конструктора.
При таком подходе, свойства создаются сами с нужными модификаторами.

Свойства только для чтения

... https://metanit.com/web/typescript/3.10.php

Clone this wiki locally