TypeScript 特殊类型

除了 number、string、boolean 等常规类型,TypeScript 还提供 any、unknown、never、void、object 这组「特殊类型」,用于描述不确定的值、永不返回的函数、无返回值的函数等特殊场景。

any:关闭类型检查

any 表示「任意类型」,可以赋任何值、调用任何方法,代价是放弃编译期保护:

let data: any = 42;
data = "字符串"; // 合法
data = true;     // 合法
console.log(data); // 输出:true

能用明确类型就不要用 any,滥用它会失去 TypeScript 存在的意义。

unknown:安全的 any

unknown 同样能接收任意值,但使用前必须先收窄,比 any 安全得多:

let input: unknown = "hello";
// console.log(input.length); // 报错:unknown 上不能直接访问属性
if (typeof input === "string") {
  console.log(input.length); // 输出:5(收窄后才能用)
}
let n: unknown = 42;
let m: number = n as number; // 需要断言后才能赋值
console.log(m + 1);          // 输出:43

never:永不返回的值

never 表示「不可能发生的类型」:抛异常的函数、死循环都没有返回值,适合标注为 never:

function throwError(msg: string): never {
  throw new Error(msg); // 抛错,函数永远不会正常返回
}

never 也常用于穷尽性检查,让编译器确认所有分支都被处理:

type Shape = "circle" | "square";
function area(s: Shape): number {
  if (s === "circle") return 1;
  if (s === "square") return 2;
  return s; // 此处 s 已被收窄为 never,说明分支已穷尽
}
console.log(area("circle")); // 输出:1

void:没有返回值

void 用于标注「不 return 任何值」的函数;它描述的是函数的行为,而不是值本身:

function log(message: string): void {
  console.log(message); // 函数体内没有 return
}
log("你好"); // 输出:你好

object:非原始类型的对象

object 表示「非原始类型」的值(对象、数组、函数等),但不够精确,一般不用它描述具体结构:

let obj: object = { name: "张三" };
obj = [1, 2];    // 数组也是 object,合法
obj = () => 1;   // 函数也是 object,合法
// obj = "abc";  // 报错:字符串是原始类型

要给对象定义精确结构时,应优先使用 interface 或 type。

小结

特殊类型各司其职:unknown 比 any 安全,never 表达「不可能」,void 描述无返回值,object 泛指非原始值。写健壮代码的原则是:拒绝 any、少用断言、多用类型收窄。

笔记加载中…