Чем отличаются unknown, any и never и как они связаны с сужением типов?
Type Narrowing и Guards
`any` отключает проверку типов, `unknown` — безопасный «неизвестный» тип, а `never` — тип значения, которого не бывает.
any
Позволяет делать что угодно: вызывать методы, читать свойства. Ошибки появятся только во время выполнения.
unknown
Принимает любое значение, но использовать его можно, только сузив тип проверкой:
function parse(input: unknown) {
if (typeof input === 'string') return input.trim();
if (Array.isArray(input)) return input.length;
throw new Error('Unsupported input');
}Подходит для данных из JSON.parse, ответов API и блока catch.
never
- Тип функции, которая никогда не завершается (бросает ошибку или бесконечный цикл).
- Остаток в исчерпывающей проверке union.
- Результат пересечения несовместимых типов.
Правило
Вместо any лучше unknown и явное сужение: так компилятор заставляет проверить данные.
Коротко для собеседования
any ломает типизацию, unknown требует проверки перед использованием, never обозначает невозможное значение и помогает проверять полноту.