TypeScript 的三种特殊类型

any

表示任意类型,对 TypeScript 的类型检查器完全关闭检查。编译器不会对它进行任何类型检查,也不会自动补全类型信息。

let value: any;

value = 42;
value = "hello";
value = [1, 2, 3];

console.log(value.toFixed()); // 编译器不会报错,但运行时可能出错
  • 兼容所有类型(可以赋值给任何类型,也可以接受任何类型赋值)
  • 不安全,等于放弃了 TypeScript 的类型系统

unknown

也是可以接受任何类型的变量,但不能直接使用,除非先做类型检查或断言。安全的任意类型

let value: any;

value = 42;
value = "hello";
value = [1, 2, 3];

// console.log(value.toFixed()); // 报错 Object is of the 'unknown'

if ( typeof value == "number" ) {
  console.log(value.toFixed()); // 先检查后使用
}
  • 可以接受任何类型赋值(类似 any)
  • 不能直接使用(需要类型缩小或断言)
  • 更安全,更适合函数入参或外部数据

never (不可能的类型)

表示永远不会发生的值。 通用用于明确函数不会返回(抛错、死循环);类型保护不完整时,确保类型覆盖完整性。

// 抛出的异常函数
function throwError(msg: string): never {
  throw new Error(msg);
}


// 死循环函数
function loopForever(); never {
  while (true) {}
}

// 不可达的分支
function exhaustiveCheck(value: "a" | "b"): number {
  if ( value === "a") return 1;
  if ( value === "b") return 2;

  // value 的类型为 never, 如果执行到这里说明之前的类型判断不完整
  const check: never = vlaue;
  return check;
}

总结对比表

特性anyunknownnever
可接受任何值✅ 是✅ 是❌ 否
可赋值给其他类型✅ 是❌ 否(需断言/缩小)✅ 是
可被其他类型赋值✅ 是✅ 是❌ 否
编译器检查❌ 无类型检查✅ 有(使用前需检查)✅ 编译器保证类型不可达
安全性❌ 不安全✅ 安全✅ 类型系统完整性保障
使用场景快速开发、兼容旧代码外部数据、泛型参数永不返回函数、穷尽检查等