typescript - 为什么 `type T1 = undefined & {}` 从不出现在

我在 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 的明显属性)。唯一不能分配给 {} 的值是 nullundefined .所以你可以想到{}作为“除 nullundefined 之外的任何内容”。

因此,类型 undefined & {}在概念上对应于所有值都是 undefined和“除 nullundefined 之外的任何内容”。但是没有适合的值,所以,至少在概念上,undefined & {}是空交集,应该等同于 the impossible never type没有值。

在实践中,有时 TypeScript 不会立即将空交集减少为 never .但是任何涉及至少一种基本类型的空交集,如 undefined确实会如此减少,如 microsoft/TypeScript#31838 中实现的那样.所以undefined & {}never .


请注意 the NonNullable<T> utility type有as of TypeScript 4.8被重新定义为 T & {} .因为{}是“除 nullundefined 之外的所有内容”,然后在概念上是 T 的交集与 {}将产生类似 T 的类型与 nullundefined从中删除。

从这个角度来看,NonNullable<undefined>NonNullable<null>应该是 never ,因为您正在从自身中移除一些东西并且什么都没有留下。

关于typescript - 为什么 `type T1 = undefined & {}` 从不出现在 Typescript 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73903600/

相关文章:

haskell - 我可以在 Haskell 中将数字全局限制为只有 3 位小数吗?

regex - 包含至少两个数字/字母的序列的 Python 正则表达式

c++ - 如何在始终选择第一个元素并过滤其余元素的范围内创建 View ?

regex - 为什么 Perl 正则表达式不匹配 "\n"和后面的字符?

Python - 如何删除以数字开头并包含句点的单词

bash - 使用 sed 删除算术形式

r - 识别/描述向量中具有特定值的连续几天的序列

c++ - 我可以继承 std::array 并重载 operator [] 吗?

python - 在代表 python 中大文件的大字符串上加速 re.sub()?

rust - -1 和 pow 的特殊行为