Іноді виникає необхідність вказати компілятору, що певна змінна має розглядатись як конкретний тип. Для цього у TypeScript існує механізм Type Assertion (або твердження типу). Це може бути корисним, коли змінна представляє якийсь універсальний тип (наприклад any або union), котрий допускає значення різних типів. Однак при тому, що тип може бути невизначеним або неочевидним, нам треба використовувати змінну як значення строго визначеного типу.

Синтаксис Type Assertion у TypeScript

У TypeScript є два варіанти синтаксису для твердження типів:

  • кутові дужки (Angle-bracket syntax)
  • ключове слово as

Обидва підходи виконують однакову функцію, але ключове слово as вважається більш кращим варіантом.

Приклад використання кутових дужок:

const someValue: any = 'text';
const stringLength: number = (<string>someValue).length;

Приклад використання ключового слова as:

const someValue: any = 'text';
const stringLength: number = (someValue as string).length;

Type Assertion для об’єктів

Поширений приклад використання твердження типу, виникає під час перенесення коду з JavaScript на TypeScript. Розглянемо наступний приклад:

const employee = {};

employee.code = 123; // Property 'code' does not exist on type '{}'
employee.name = 'Jhon'; // Property 'name' does not exist on type '{}'

В цьому коді, TypeScript повідомляє про помилки, тому що очікуваний тип для employee це {}, тобто об’єкт без властивостей. Через це ми не можемо додати до нього властивості code або name. Це можна виправити за допомогою твердження типу:

interface Employee {
  code: number;
  name: string;
}

const employee = {} as Employee;
employee.code = 123; // Ok
employee.name = 'John'; // Ok

Недоліки Type Assertion у TypeScript

Використовуючи твердження типу, ми примусово вказуємо компілятору, що будь-який тип, який ми присвоюємо, є правильним, що може призвести до помилок у програмі, оскільки іноді ми можемо помилятись.

Type Assertion у TypeScript не виконує ніяких спеціальних перевірок, не змінює фактичний тип значення, він лише повідомляє компілятору, яким чином слід його інтерпретувати. Тому безпечніше оголошувати тип змінної явно, і використовувати Type Assertion обережно, тільки переконавшись що він є дійсним.

Розглянемо приклад:

const value: any = '123';

const numberValue = value as number; // Вважаємо рядок числом
console.log(numberValue.toFixed(2)); // Runtime Error: value.toFixed is not a function

У цьому вигаданому прикладі, ми примусово переконуємо компілятор у тому, що рядок є числом, що призводить до помилки під час виконання.


Мітки: