Что такое пользовательские type guards и assertion functions?
Type Narrowing и Guards
Type guard — функция, которая возвращает boolean и сообщает компилятору, как сузить тип, когда результат true.
Предикат типа
interface Cat { meow(): void }
interface Dog { bark(): void }
function isCat(pet: Cat | Dog): pet is Cat {
return 'meow' in pet;
}
function speak(pet: Cat | Dog) {
if (isCat(pet)) pet.meow(); // Cat
else pet.bark(); // Dog
}Проверка данных с сервера
function isUser(value: unknown): value is { id: number; name: string } {
return (
typeof value === 'object' && value !== null &&
typeof (value as any).id === 'number' &&
typeof (value as any).name === 'string'
);
}Assertion function
Выбрасывает ошибку, если условие не выполнено, и сужает тип после вызова:
function assertDefined<T>(value: T | undefined): asserts value is T {
if (value === undefined) throw new Error('Value is undefined');
}Предупреждение
Компилятор верит предикату на слово. Неправильная реализация даст ложную уверенность, поэтому для внешних данных надёжнее схемы валидации (Zod).
Коротко для собеседования
value is T объявляет, что при true значение имеет тип T. Реализация проверки лежит на разработчике.