Как из Unknown получить другой тип?
Продвинутые темы
Из `unknown` получают другой тип через сужение (narrowing): проверки `typeof`, `instanceof`, `in`, пользовательские type guards, или явное приведение (`as`) — но только после проверки.
unknown требует проверки
unknown — безопасный аналог any: значение неизвестного типа, но перед использованием нужно сузить тип:
let value: unknown = getData();
value.toUpperCase(); // ошибка — нельзя без проверкиСпособы сужения
typeof (для примитивов)
if (typeof value === 'string') {
value.toUpperCase(); // здесь value: string
}instanceof (для классов)
if (value instanceof Date) {
value.getTime(); // value: Date
}in (проверка свойства)
if (typeof value === 'object' && value !== null && 'name' in value) {
// value имеет свойство name
}Пользовательский type guard
function isUser(v: unknown): v is User {
return typeof v === 'object' && v !== null && 'id' in v;
}
if (isUser(value)) value.id; // value: UserЯвное приведение (as) — с осторожностью
const user = value as User; // приведение без проверки — небезопасноЛучше после проверки; as не проверяет в рантайме.
unknown против any
- any — отключает проверки (опасно).
- unknown — требует сузить тип перед использованием (безопасно).
Коротко для собеседования
Из unknown получают тип сужением: typeof (примитивы), instanceof (классы), in (свойства), пользовательские type guards (v is Type), или as (явное приведение — небезопасно, без рантайм-проверки). unknown безопаснее any — требует проверки перед использованием. Предпочтительно сужать через проверки, а не as.