Last updated on Oct 6, 2022

any 和 unknow 等价。设定上: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 {} 实际上是两种完全不同的比较方式:
{} extends object 和 {} extends Object 而言, {} 是 object 和 Object 的字面量类型,是从类型信息的层面出发(即字面量类型在基础类型之上提供了更详细的类型信息)object extends {} 和 Object extends {} 则是从结构化类型系统的层面出发的(即 {}
作为一个一无所有的空对象,几乎可以被视作是所有类型的基类(可以是 String、也可以是 Object、object 等))而 object extends Object 和 Object extends object 的情况要特殊一些。
object 包含了所有非原始类型的类型(即数组、对象与函数类型等)Object 包含了所有除 Top Type 以外的类型(基础类型、函数类型等)所以导致了你中有我,我中有你这一现象。