TypeScript中{}类型为何排除null/undefined?与object类型差异解析
TypeScript中{}与object类型的核心区别
1. 类型覆盖范围差异
object类型:仅包含非原始类型,也就是普通对象、数组、函数、类实例等所有引用类型,直接排除string、number、boolean、null、undefined、symbol、bigint这些原始类型。{}类型:包含除null和undefined之外的所有类型。因为在TypeScript的类型系统中,原始类型(比如string)会被视为具备Object原型方法(如toString()、valueOf())的类型,所以原始类型可以赋值给{}。
2. 示例检测结果的原因
看给出的代码示例:
const testStr1: Object1 = '';能通过检查:因为Object1是{}类型,它允许除null/undefined外的所有类型赋值,string属于这个范围。const testStr2: Object2 = '';报错:因为Object2是object类型,它明确禁止原始类型赋值,string是原始类型,自然不满足约束。
另外补充下NonNullable的实现逻辑:type NonNullable<T> = T & {}之所以能过滤null和undefined,正是因为{}不包含这两个值,交叉类型后就会把T中的null/undefined排除;如果换成T & object,会同时把原始类型也过滤掉,这就不符合NonNullable只排除null/undefined的设计目标了。
内容的提问来源于stack exchange,提问作者lnuvy
相关产品推荐
相关产品推荐

