Kodokon kodokon.com

类型推断、any 与 unknown

让 TypeScript 通过推断自己判断类型,并理解为什么 unknown 胜过危险的 any。

8 分钟 · 3 题

在 Kodokon 中打开本课

好消息:你不必为每一个变量都写注解。得益于类型推断,TypeScript 会根据你赋给变量的值推断出它的类型。只写 let city = "Lyon" 就足够了:TypeScript 知道 city 是一个 string,并像你手动注解过一样保护它。

TYPESCRIPT
let city = "Lyon"; // inferred type: string
let count = 3;     // inferred type: number

count = count + 1; // accepted
// city = 42; -> error: city is still a string
没有注解,类型却一应俱全。

any 类型的意思是“任何东西”。一个 any 变量逃过所有检查:TypeScript 接受一切,不做任何核实。这就像解开了安全带:代码能通过编译,但错误会在运行时卷土重来——而这恰恰是 TypeScript 本该防止的。

TYPESCRIPT
let data: any = "hello";
data = 42; // accepted without complaint

// Compiles, but crashes at runtime:
// data.toUpperCase() does not exist on a number!
有了 any,TypeScript 就视而不见。

对于类型确实未知的值(服务器响应、用户输入),优先使用 unknown。和 any 一样,它接受任何值,但它强制你先检查类型(例如用 typeof)再使用。这样安全性依然完好无损。

TYPESCRIPT
let value: unknown = "hello";

// console.log(value.toUpperCase()); -> rejected!

if (typeof value === "string") {
  console.log(value.toUpperCase()); // "HELLO"
}
unknown 要求先检查再使用。

知识检测

确认你已牢记本课的重点内容。

  1. 什么是类型推断?
    • TypeScript 根据初始值判断出类型
    • TypeScript 从程序中移除类型
    • TypeScript 把数字转换成文本
  2. 为什么应尽可能避免使用 any?
    • 它会拖慢程序
    • 它会关闭 TypeScript 的检查
    • 它被语言所禁止
    • 它只对数字有效
  3. 在使用一个 unknown 类型的值之前,你必须做什么?
    • 检查它的类型,例如用 typeof
    • 把它转换成 any
    • 再次声明它