Last updated on Oct 6, 2022

TypeScript 全面进阶指南 - 林不渡 - 掘金课程.png

Top Type

anyunknow 等价。设定上:any 可以表达为任何类型,unknown 则只允许赋值给 unknown 类型和 any 类型

type Result1 = any extends unknown ? 1 : 2 // 1
type Result2 = unknown extends any ? 1 : 2 // 1

顶级类型 Object 之间的关系

type Result3 = Object extends any ? 1 : 2     // 1
type Result4 = Object extends unknown ? 1 : 2 // 1

type Result5 = any extends Object ? 1 : 2     // 1 | 2
type Result6 = unknown extends Object ? 1 : 2 // 2

因为 TypeScript 设定的原因,any 代表了任何可能的类型,当我们使用 any extends 时,它既包含了「让条件成立的一部分」,同时也包含了「让条件不成立的一部分」。所以在 TypeScript 内部代码的条件类型处理中,如果接受判断的是 any,那么会直接返回条件类型结果组成的联合类型。

装箱类型

首先看一下 Object、object、{}(在 Object vs object vs {} 中介绍过 Object vs object vs {} 之间的差异)

type Result1 = {} extends object ? 1 : 2 // 1
type Result2 = {} extends Object ? 1 : 2 // 1
type Result3 = object extends {} ? 1 : 2 // 1
type Result4 = Object extends {} ? 1 : 2 // 1

type Result5 = object extends Object ? 1 : 2 // 1
type Result6 = Object extends object ? 1 : 2 // 1

这里的 {} extends 和 extends {} 实际上是两种完全不同的比较方式:

object extends Object 和 Object extends object 的情况要特殊一些。

所以导致了你中有我,我中有你这一现象。