Как я и писал в одном из своих постов в телеге, тайпгарды есть двух видов: уточняющие и определяющие. Уточняющие попроще, их я разобрал как раз в прошлом посте.
Определяющие тайпгарды — это функции, которые позволяют уточнить тип unknown переменной. Сразу рассмотрим пример и рассмотрим следующий интерфейс:
typescript1interface User { 2 name: string; 3 age: number; 4 roles: string[]; 5} 6
И представим, что в коде у нас есть некоторая переменная с неизвестным типом, которую мы хотим обработать:
typescript1const foo: any = ... 2 3if (isUser(foo)) { 4 // обработать как пользователя 5} else { 6 // обработать как что-то иное 7} 8
Определяющие тайпгарды любую переменную воспринимают как unknown, это их ключевая особенность. Каждое свойство мы проверяем отдельно и таким образом, чтобы однозначно убедиться в его типе. Для интерфейса из примера, хороший тайпгард будет выглядеть так:
typescript1function 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 в полной мере.
Статья была полезной?
Читайте также:
— 3 минуты
Составные компоненты
Есть такой паттерн для реакта, который называется Compound Components. Это...
— 3 минуты
Сужение типов и уточняющие тайпгарды
Часто в TypeScript коде можно столкнуться с тем, что типы недостаточно точн...
— 2 минуты
Как реагировать на изменения объекта
В JavaScript обычные объекты не умеют уведомлять о своих изменениях, однако...