tgoop.com/prog_way_blog/294
Create:
Last Update:
Last Update:
Сужение типов и уточняющие тайпгарды
Часто в TypeScript коде можно столкнуться с тем, что типы недостаточно точны. Это бывает в случаях, когда мы определяем типы, например, через union
— string | number
и других подобных случаях. Рассмотрим пример:
const value: string | number = ...
parseInt(value) // ошибка
В таком случае мы получим
TypeError
, а всё потому что переменная value
имеет более общий тип, чем тот, что ожидает parseInt
— эта функция ожидает первым аргументом на вход только строку. В таком случае нам может помочь сужение типов, которое нам дают дополнительные проверки — тайпгарды.Тайпгарды — Type Guards — это языковые конструкции, проверки, которые позволяют определить или уточнить тип переменной средствами JavaScript. Тайпгарды бывают двух видов — уточняющие и определяющие.
Уточняющие тайпгарды — проверки, которые позволяют вывести более узкий тип из общего типа, например вывести
string
из типа string | number | boolean | null
.Определяющие же тайпгарды — проверки, которые позволяют вывести узкий тип из неизвестного типа, который в идеальном мире обозначается типом
unknown
Есть несколько способов сузить тип:
1. Через оператор
typeof
const value: string | number = ...
if (typeof value === 'string') {
// ошибки не будет, т.к.
// тип value в этом условии
// строго равняется "string"
parseInt(value)
}
2. Через ключевое слово
in
или метод hasOwnProperty
const value: any[] | number = ...
if ("map" in value) {
// value === array
value.map(...)
}
const animal = Cat | Dog = ...
if (animal.hasOwnProperty('meow')) {
// animal === Cat
animal.meow()
}
3. Через ключевое слово
instanceof
const person: Fireman | Programmer = ...
// при условии что Programmer - класс
// а person - инстанс класса
if (person instanceof Programmer) {
person.code()
}
4. Через встроенные в язык функции проверки типа
const value: any[] | number = ...
if (Array.isArray(value)) {
value.map(...)
}
5. Через
existed check
, например, для null
и undefined
const user: User | null = ...
if (user) {
console.log(user.name)
}
Также подобные проверки можно выносить в отдельные функции, которые обычно именуются по следующему шаблону —
is + <название типа или интерфейса>
, например, для типа User
будет логично создать тайпгард isUser
, вот небольшой пример:type Account = User | Admin | Manager
const isUser = (account: Account): account is User => {
return account.type === "user"
}
В данном случае мы используем предикат для пользователя. Вообще, предикат — это базовый математический термин, но если кто-то не знал изи подзабыл, также напоминаю:
В нашем контексте, предикат — уникальное определяющее свойство сущности, относительно которого можно быть точно уверенным в её идентичности.
Если более просто, то мы знаем, что если
account.type === “user”
, то перед нами ни что иное как User
. В этом случае тип аккаунта является предикатом, на основе которого можно делать выводы о типе аккаунта без дополнительных проверок.И всё это касается лишь уточняющих тайпгардов, пост об определяющих тайпгардах выйдет позже.
Спасибо за прочтение, это важно для меня ❤️
@prog_way_blog — чат — #theory #code #typescript
BY progway — программирование, IT

Share with your friend now:
tgoop.com/prog_way_blog/294