Загрузка…
Загрузка…
TypeScript · middle · сложность 6
any — opt-out (выключает проверку, заразен, опасен); unknown — безопасный top type (принимает всё, но требует narrowing); never — bottom type (значений нет — return у throw, пустой union, ветка «невозможно»).
На решётке типов: unknown сверху (всё assignable в него), never снизу (assignable куда угодно, но в него — почти ничего). any стоит особняком — отключает систему.
unknown для границ: JSON, catch, внешние SDK. never для exhaustiveness и функций, которые не возвращают. any — только осознанный escape hatch с планом удаления.
// any — contagious, unsafe, silent
const a: any = JSON.parse('{}');
a.foo.bar.baz(); // ✅ compiles, ❌ crashes — no checking at all
const n: number = a; // any flows into number with no error
// unknown — safe top type; must narrow before use
const u: unknown = JSON.parse('{}');
// u.foo; // ❌ Error: object is of type 'unknown'
if (typeof u === 'object' && u && 'foo' in u) {
(u as { foo: unknown }).foo; // ✅ only after narrowing
}
// never — the bottom type
function fail(msg: string): never { throw new Error(msg); } // never returns
type T = string | never; // = string (never disappears from unions)
// never powers exhaustiveness
type Dir = 'up' | 'down';
function move(d: Dir) {
switch (d) {
case 'up': return 1;
case 'down': return -1;
default: const _: never = d; return _; // errors if a new Dir is added
}
}// catch clauses are `unknown` (with useUnknownInCatchVariables/strict) — not `any`
try { /* ... */ } catch (e) {
// e.message; // ❌ e is unknown
if (e instanceof Error) console.log(e.message); // ✅ narrow first
}Предпочитайте unknown вместо any; never — для невозможного и исчерпывающих switch. any — последний курорт.