typescript - 为什么类型 "never"在联合类型中毫无意义?

标签 typescript typescript-typings union-types typescript-types

Typescript playground
我在试图理解类型 never 的事实时遇到了一些麻烦。没有意义,当它在 中时可以丢弃联合类型 .
我的意思是,我在 中得到了它路口类型 , never将立即使一切结果 never ,因为没有类型可以通过某些类型和 never在同一类型。对于我,这说得通。
enter image description here
但在 联合类型 ,我的直觉最初告诉我never type 将是一个有效的选项。我的问题是为什么不是?为什么never可以在联合类型中丢弃吗?
enter image description here
有人可以对此做出合理的解释,以便我更好地理解它吗?

最佳答案

将类型视为 set 的一种方式可分配给它的所有值。所以boolean可以认为是 { true , false },只包含这两个值的集合。和 string可以被认为是(本质上)包含所有可能的无限集合 string值(value)。
在 typescript 中,neverbottom type .它没有任何值(value)。如果您有一个 JavaScript 值并且您问“这是 never 类型的值吗?”那么答案是“不”。在套数方面,never可以认为是∅,
empty set .
在从类型到值集的映射中,intersection TypeScript ( & ) 中的操作可以被认为是 set intersection操作(∩)。如果你有集合 A 和 B,那么 A∩B 就是恰好是 A 和 B 成员的对象的集合。对于任何集合 A,A∩∅ 与空集的交集就是空集 ∅。 A 和空集中都没有元素,因为空集中根本没有元素。回到 TypeScript 类型,这意味着 A & never变成 never适用于任何类型 A .如果 TypeScript 编译器刚离开 string & never 则有效如 string & never ,但实际上它继续并将其减少到 never自动,因为后一种表示更简单。
另一方面:在从类型到值集的映射中,union TypeScript ( | ) 中的操作可以被认为是 set union操作(∪)。如果您有集合 A 和 B,则 A∪B 是恰好属于 A 或 B 成员的对象的集合(这是一个包含或)。对于任何集合 A,具有空集的并集 A∪∅ 就是 A。该并集包含 A 的所有元素和空集的所有元素。由于没有空集的元素,那只是“A 的所有元素”。回到 TypeScript 类型,这意味着 A | never变成 A适用于任何类型 A .如果 TypeScript 编译器刚离开 string | never 则有效如 string | never ,但实际上它继续并将其减少到 string自动,因为后一种表示更简单。
所以这就是基本的解释。还有其他类比,例如 bool 逻辑命题,例如“此元素是此类型的成员”,对于 never 总是假的。类型,导致诸如 A ∧ FALSE = FALSE 和 A ∨ FALSE = A 之类的东西。和歧视工会而不是普通工会)和 never type 是 0。但希望这能提供足够的直觉来了解编译器为什么会这样。
请注意,还有一个 top type在名为 unknown 的 TypeScript 中其行为与 never 的对偶完全相同在那A & unknown = AA | unknown = unknown并且具有集合论中的对偶模拟(universal set/class)。但是你没有问这个,这个答案已经足够长了。

关于typescript - 为什么类型 "never"在联合类型中毫无意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64230626/

相关文章:

visual-studio - 更新 Angular2 项目中的 Typescript

scala - T 和 List[T] 的类型参数边界

typescript - 来自枚举和接口(interface)的自定义键/值类型

Monorepo 中的 typescript eslint tsconfig 解析错误

javascript - 如果 Material Angular 数据表中的变量为 true,则隐藏特定列

Angular 和 PouchDBFind 插件

angular - (Angular 5) 错误 : control. registerOnChange 不是函数

javascript - 如何将对象属性设置在不同的地方?

联合的TypeScript数组与数组的联合

typescript - 通过判别式获取联合类型