Literal Types

Літерали — це точні значення, які є примітивами JavaScript.

String Literals

Ви можете використовувати рядковий літерал як тип. Наприклад:

let foo: 'Hello';

Тут ми створили змінну під назвою foo, яка дозволить лише призначити йому літеральне значення 'Hello'. Це показано нижче:

let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" не можна призначити типу "Hello"

Вони не дуже корисні самі по собі, але їх можна об’єднати в об’єднання типів для створення потужної (і корисної) абстракції, наприклад:

type CardinalDirection =
    | "North"
    | "East"
    | "South"
    | "West";

function move(distance: number, direction: CardinalDirection) {
    // ...
}

move(1,"North"); // Okay
move(1,"Nurth"); // Error!

Other literal types

TypeScript також підтримує типи літералів boolean і number, наприклад:

Inference

Досить часто ви отримуєте помилку на зразок Тип string не можна призначити типу "foo". Наступний приклад демонструє це.

Це тому, що test має тип {someProp: string}. Виправлення тут полягає у використанні простого твердження типу, щоб повідомити TypeScript літерал, який ви хочете, щоб він визнав, як показано нижче:

або використовуйте анотацію типу, яка допомагає TypeScript вивести правильний висновок у точці оголошення:

Use cases

Допустимі варіанти використання типів рядкових літералів:

String based enums

TypeScript enums are number based. Ви можете використовувати рядкові літерали з типами об’єднання, щоб імітувати перелік на основі рядків, як ми робили у прикладі CardinalDirection вище. Ви навіть можете створити структуру Key:Value за допомогою такої функції:

А потім згенеруйте літеральне об’єднання типів за допомогою keyof typeof. Ось повний приклад:

Modelling existing JavaScript APIs

наприклад CodeMirror editor has an option readOnly, яка може бути або логічним значенням, або літеральним рядком "nocursor" (дійсні дійсні значення true ,false,"nocursor"). Його можна оголосити так:

Discriminated Unions

Ми розглянемо this later in the book.

Last updated