Top Type & Bottom Type in TypeScript

在 TypeScript 的类型系统中,Top Type(顶层类型)Bottom Type(底层类型) 是两个非常重要的概念。它们分别代表了类型范围的“最顶层”和“最底层”,理解它们对于掌握 TypeScript 的类型系统至关重要。

什么是 Top Type?

Top Type 是类型系统中最宽泛的类型,表示它可以包含任何其他类型。在 TypeScript 中,有两种主要的 Top Type:anyunknown

any

any 是 TypeScript 中最宽松的类型。它可以表示任意类型的值,使用 any 时,TypeScript 会关闭类型检查,这意味着你可以对 any 类型的变量进行任何操作,而不会触发类型错误。

1
2
3
4
5
6
let value: any

value = 42 // 合法
value = "hello" // 合法
value = true // 合法
value = [1, 2, 3] // 合法

特点:

  • 灵活性高,但类型安全性低。
  • 适合在需要动态类型或迁移旧代码时使用,但应尽量避免。

unknown

unknown 是 TypeScript 2.0 引入的类型,表示类型未知。与 any 不同,unknown 是类型安全的。在使用 unknown 类型的值之前,必须进行类型检查或类型断言。

1
2
3
4
5
6
7
8
9
let value: unknown

value = 42 // 合法
value = "hello" // 合法
value = true // 合法

if (typeof value === "number") {
console.log(value.toFixed(2)) // 合法,已进行类型检查
}

特点:

  • 类型安全,适合处理不确定类型。
  • 需要显式的类型检查或断言。

什么是 Bottom Type?

Bottom Type 是类型系统中最具体的类型,表示它不包含任何值。在 TypeScript 中,never 是唯一的 Bottom Type。

never

never 表示永远不会发生的值,通常用于以下场景:

  • 函数抛出异常:函数永远不会正常返回。
  • 无限循环:函数永远不会结束。
  • 类型收窄:在类型收窄后,某些分支不可能发生。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 1. 函数抛出异常
function throwError(message: string): never {
throw new Error(message)
}

// 2. 无限循环
function infiniteLoop(): never {
while (true) {}
}

// 3. 类型收窄
function checkType(value: string | number) {
if (typeof value === "string") {
console.log("String:", value)
} else if (typeof value === "number") {
console.log("Number:", value)
} else {
// 这里的 value 类型是 never,因为前面的分支已经覆盖了所有可能
const exhaustiveCheck: never = value
}
}

特点:

  • 表示不可能发生的值。
  • 用于确保代码的完整性和安全性。

Top Type 和 Bottom Type 的关系

在 TypeScript 的类型层次结构中:

  • Top Type 是所有类型的超集,可以包含任何值。unknownany 是典型的 Top Type。
  • Bottom Type 是所有类型的子集,不包含任何值。never 是唯一的 Bottom Type。

它们的关系可以用以下方式表示:

1
2
3
4
5
6
Top Type (any, unknown)

|
|

Bottom Type (never)

总结

类型 描述 特点 使用场景
any 任意类型 关闭类型检查 动态类型,旧代码迁移
unknown 未知类型 类型安全,需类型检查 处理不确定类型
never 不可能发生的类型 不包含任何值 异常/无限循环/类型收窄

通过理解 Top Type 和 Bottom Type,可以更好地掌握 TypeScript 的类型系统,并编写更安全、更健壮的代码。在实际开发中,尽量使用 unknown 替代 any,并善用 never 来确保代码的完整性和安全性。