我在 TypeScript 文档中查找了它。
文档说 NonNullable 排除 null 或 undefined
type NonNullable<T> = T & {};
为什么 undefined & {}
是never
?
https://www.typescriptlang.org/docs/handbook/utility-types.html#nonnullabletype
最佳答案
如果你有两种类型,A
, 和 B
, 然后是 intersection type A & B
对应于两者 A
的所有值和 B
同时。
empty object type {}
对应于您可以索引到而不会出现运行时错误的任何类对象值。所以所有对象类型都可以分配给 {}
,以及大多数原始类型,如 string
(因为 string
具有类似 toUpperCase
的明显属性)。唯一不能分配给 {}
的值是 null
和 undefined
.所以你可以想到{}
作为“除 null
或 undefined
之外的任何内容”。
因此,类型 undefined & {}
在概念上对应于所有值都是 undefined
和“除 null
或 undefined
之外的任何内容”。但是没有适合的值,所以,至少在概念上,undefined & {}
是空交集,应该等同于 the impossible never
type没有值。
在实践中,有时 TypeScript 不会立即将空交集减少为 never
.但是任何涉及至少一种基本类型的空交集,如 undefined
确实会如此减少,如 microsoft/TypeScript#31838 中实现的那样.所以undefined & {}
是never
.
请注意 the NonNullable<T>
utility type有as of TypeScript 4.8被重新定义为 T & {}
.因为{}
是“除 null
或 undefined
之外的所有内容”,然后在概念上是 T
的交集与 {}
将产生类似 T
的类型与 null
和 undefined
从中删除。
从这个角度来看,NonNullable<undefined>
或 NonNullable<null>
应该是 never
,因为您正在从自身中移除一些东西并且什么都没有留下。
关于typescript - 为什么 `type T1 = undefined & {}` 从不出现在 Typescript 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73903600/