Перейти до основного вмісту
Модуль 5 · Урок 2 із 210/14 у курсі~15 min
Модульні уроки (2/2)

Літеральні типи та твердження

TypeScript надає розширені інструменти для звуження можливих значень змінних і змусити компілятор розпізнавати більш конкретні типи, коли це необхідно.

Літеральні типи

Літеральний тип представляє точне єдине значення (наприклад, певний рядок або число). Зазвичай вони поєднуються з типами союзів:

TS
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;

light = 'red'; // OK
light = 'blue'; // Error: "blue" is not assignable to TrafficLight

Твердження типу (as)

Іноді у вас є інформація про тип, яку TypeScript не може знати під час компіляції. У цих випадках ви можете використовувати затвердження типу за допомогою ключового слова as:

TS
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;

Твердження повідомляє компілятору: "Повір мені, я знаю, що цей елемент є HTMLCanvasElement". Він не виконує жодних перевірок або приведення під час виконання; це лише допомагає перевірці типів.

Const Assertions (as const)

Коли ми оголошуємо об’єкт або масив за допомогою const, TypeScript все ще дозволяє змінювати його внутрішні властивості. Додавши as const в кінці, вся структура заморожується і стає доступною лише для читання, перетворюючи всі властивості на їхні точні літеральні типи:

TS
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Error: array is read-only

Типи літеральних шаблонів

Типи літеральних шаблонів створюються на основі рядків шаблону JavaScript, але використовуються в позиціях типів. Вони дозволяють поєднувати декілька типів літералів в один:

TS
type Size = 'small' | 'large';
type Color = 'red' | 'blue';

// Creates the union: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;

Утиліти рядків у типах літеральних шаблонів

TypeScript надає спеціальні типи утиліт для маніпулювання символами в межах типів літеральних шаблонів:

  • Capitalize<StringType>: робить першу літеру рядка великою.
  • Uncapitalize<StringType>: Вилучає першу літеру рядка з великої літери.
  • Uppercase<StringType>: перетворює весь рядок у верхній регістр.
  • Lowercase<StringType>: перетворює весь рядок на нижній регістр.
TS
type ActionType = 'click' | 'hover';

// Generates: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;

Спробуйте самі

Вправа 1: Direction Literal Union

вправи#ts.m5.l2.e1
Спроби: 0Завантаження…

Визначте тип літерала під назвою Direction, який приймає лише рядки «вгору», «вниз», «ліворуч» або «праворуч». Потім оголосите функцію з іменем move(dir: Direction): рядок, який повертає рядок «Moving» і отриманий напрямок.

Завантаження редактора…
Показати підказку

Спочатку визначте псевдонім типу з чотирма параметрами, розділеними |, а потім оголосите функцію переміщення, анотуючи параметр і тип повернення.

Рішення доступне після 3 спроб

Вправа 2: твердження на JSON.parse

вправи#ts.m5.l2.e2
Спроби: 0Завантаження…

Функція JSON.parse за замовчуванням повертає будь-який тип. Змініть функцію parseUser так, щоб результат JSON.parse(json) затверджувався як тип { ім’я користувача: рядок } за допомогою ключового слова as.

Завантаження редактора…
Показати підказку

Додайте 'as { ім'я користувача: рядок }' відразу після виклику JSON.parse(json).

Рішення доступне після 3 спроб

Вправа 3: Літерал шаблону для подій

вправи#ts.m5.l2.e3
Спроби: 0Завантаження…

Враховуючи типи «Статус» і «Дія», визначте тип рядка шаблону під назвою «Подія» у форматі «Статус-Дія» (наприклад, «відкрити-клацнути»).

Завантаження редактора…
Показати підказку

Використовуйте зворотні галочки, щоб визначити тип і синтаксис ${Status}-${Action} всередині.

Рішення доступне після 3 спроб

Вправа 4: Тип літералу шаблону з великими літерами

вправи#ts.m5.l2.e4
Спроби: 0Завантаження…

Визначте літеральний тип Event, який може бути «клацанням» або «наведенням». Потім скористайтеся шаблонними літеральними типами, щоб оголосити тип EventHandler, який представляє рядки у форматі on , після якого йде назва події з великої літери (тобто «onClick» або «onHover»).

Завантаження редактора…
Показати підказку

Використовуйте Capitalize<Event> у літералі шаблону, щоб зробити першу літеру події великою.

Рішення доступне після 3 спроб