Определяющие тайпгарды

  —  2 минуты

#theory#typescript#code
Читать статью в Telegram

Как я и писал в одном из своих постов в телеге, тайпгарды есть двух видов: уточняющие и определяющие. Уточняющие попроще, их я разобрал как раз в прошлом посте.

Определяющие тайпгарды — это функции, которые позволяют уточнить тип unknown переменной. Сразу рассмотрим пример и рассмотрим следующий интерфейс:

typescript
1interface User {
2    name: string;
3    age: number;
4    roles: string[];
5}
6

И представим, что в коде у нас есть некоторая переменная с неизвестным типом, которую мы хотим обработать:

typescript
1const foo: any = ...
2
3if (isUser(foo)) {
4 // обработать как пользователя
5} else {
6  // обработать как что-то иное
7}
8

Определяющие тайпгарды любую переменную воспринимают как unknown, это их ключевая особенность. Каждое свойство мы проверяем отдельно и таким образом, чтобы однозначно убедиться в его типе. Для интерфейса из примера, хороший тайпгард будет выглядеть так:

typescript
1function isUser(value: unknown): value is User {
2    const user = value as User;
3
4    return user !== null 
5        && typeof user === 'object' 
6        && typeof user.name === 'string'
7        && typeof user.age === 'number'
8        && Array.isArray(user.roles)
9        && user.roles?.every(role => typeof role === 'string');
10}
11

Это может выглядеть очень некрасиво, но главное, что работает

На практике встречается не так часто, но тот самый раз, когда он будет нужен, будет спасительным для типобезопасности вашего кода. Такие тайпгарды позволяют легко избежать использования any типов и раскрыть возможности TypeScript в полной мере.

Статья была полезной?