TypeScript中为何{}类型与object类型互相兼容?
为什么
{} extends object的结果是true? 首先得纠正你对{}类型的误解:它并不是“除null和undefined外的任意类型”,而是描述一个没有自有可枚举属性的对象类型。虽然JS里所有非null/undefined的值(包括原始类型)都能赋值给{}变量(因为它们都继承了Object的方法,比如toString),但这是值层面的赋值兼容性,和类型系统里的extends子类型判断是两回事。
接下来解释核心问题:
- TypeScript里的
object类型,指的是所有非原始类型(对象、数组、函数这类引用类型)。 {}本身就是一种对象类型,它代表“没有自有可枚举属性的对象”,自然属于object类型涵盖的范畴。- 当进行
{} extends object的类型判断时,TS是基于类型的本质来判定的:{}是对象类型的子集,而object是所有对象类型的超类型,因此这个条件判断的结果为true。
再回头看你的两个例子:
First = object extends {} ? true : false:所有object类型的值(比如普通对象、数组)都能赋值给{},所以object是{}的子类型,结果为true。Second = {} extends object ? true : false:{}本身是对象类型的一种,属于object的覆盖范围,因此结果也为true。
内容的提问来源于stack exchange,提问作者Sanitysign
相关产品推荐
相关产品推荐

