Вопрос проверяет понимание механизмов сужения типов (type narrowing) в TypeScript, в частности, как создавать пользовательские type guard для работы с типом unknown.
Тип unknown в TypeScript — это безопасная альтернатива any. Значение типа unknown нельзя использовать напрямую без проверки. Чтобы работать с ним как с конкретным типом, нужно сузить его с помощью type guard. Type guard — это функция, которая возвращает логическое значение и содержит type predicate (например, value is MyType).
Допустим, у нас есть интерфейс User:
interface User {
name: string;
age: number;
}Чтобы проверить, что значение unknown является User, напишем функцию:
function isUser(value: unknown): value is User {
if (typeof value !== 'object' || value === null) {
return false;
}
const obj = value as Record<string, unknown>;
return (
typeof obj.name === 'string' &&
typeof obj.age === 'number'
);
}Теперь TypeScript понимает, что после вызова isUser в условии if значение внутри блока имеет тип User:
function processValue(val: unknown) {
if (isUser(val)) {
console.log(val.name.toUpperCase()); // val: User
}
}null.typeof для примитивов, instanceof для классов.Вывод: Пользовательские type guard — основной способ безопасно работать с unknown в TypeScript. Они позволяют сохранить строгую типизацию и избежать ошибок времени выполнения, особенно при работе с данными из внешних источников (API, JSON).
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию