问题描述
在尝试缠住以下事实时,我遇到了麻烦:never
类型毫无意义,并且当它在 union类型内时可以将其丢弃。
我的意思是,我知道在一个交叉点类型中,never
会立即使所有结果都生成never
,因为任何类型和{{1} }的相同类型。这对我来说很有意义。
但是在 union类型中,我的直觉最初告诉我never
类型将是有效的选项。我的问题是为什么呢?为什么never
可以以联合类型丢弃?
有人可以对此给出合理的解释,以便我更好地理解吗?
解决方法
具体说明,变量type UNION_A = string | boolean | never
可以对boolean
取任何有效值,对string
取任何有效值,以及never
取任何有效值(其中根据定义,不能存在任何值),因此类型为never
的并集不会向此变量最终可能接收的值域添加任何内容。
编辑:never
类型的要点在于它是无法发生的事情的类型,通常是无法返回的函数的返回类型。
function fail() {
throw new Error(":(");
// What is the *return* type of that function?
}
let foo = fail(); // foo can only receive the type never
console.log(foo * 2); // Doesn't matter what foo is,this is guaranteed to be dead code
fail()
无法返回值,甚至null
也无法返回值。它永远不会返回,因此其返回类型为never
,并且使用该函数的返回值进行操作的任何代码基本上都是无效代码。
从不存在工会通常意味着您拥有这个
function do_thing(x) {
let foo;
if (x == 0) {
fail(); // foo is of type never
} else {
foo = 1/x; // foo is of type number
}
// Foo is technically of type number | never,// but you can discard never since it never runs.
let bar = foo * 2;
return bar;
}
,
认为类型的一种方法是将所有可分配给它的值作为set。因此boolean
可以被视为{true
,false
},该集合仅包含这两个值。并且string
可以看作是(基本上)无限集,其中包含每个可能的string
值。
在TypeScript中,never
是bottom type。它没有 no 值。如果您具有JavaScript值,并且询问“这是never
类型的值吗?”那么答案是“否”。就集合而言,never
可以认为是∅,即
empty set。
在从类型到值集的映射中,可以将TypeScript(&
)中的intersection操作视为set intersection操作(∩)。如果有集合A和B,则A∩B就是对象的完全集合,它们都是 A 和 B的成员。对于任何集合A,交集A带有空集的is就是空集∅。 A和空集中都没有元素,因为空集中根本没有元素。返回TypeScript类型,这意味着A & never
对于任何类型never
都变成A
。如果TypeScript编译器仅将string & never
保留为string & never
,那将是有效的,但实际上,它会继续进行并自动将其缩减为never
,因为后者的表示更为简单。
另一方面,在从类型到值集的映射中,可以将TypeScript(|
)中的union操作视为set union操作(∪ )。如果您有集合A和B,则A∪B就是完全属于 A 或 B(这是包含或)。对于任何集合A,具有空集合的并集A∪∅就是A。该并集包含A的所有元素和空集合的所有元素。由于没有空集的元素,因此就是“ A的所有元素”。返回TypeScript类型,这意味着A | never
对于任何类型A
都变成A
。如果TypeScript编译器仅将string | never
保留为string | never
,那将是有效的,但实际上,它会继续进行并自动将其缩减为string
,因为后者的表示更为简单。
这就是基本解释。还有其他类比,例如布尔逻辑命题,例如“此元素是此类型的成员”,对于never
类型始终为FALSE,从而导致诸如A∧FALSE = FALSE和A∨FALSE =A。或像算术一样,类比不是精确的,但是交集看起来像乘法,联合看起来像加法(此类比对适用于对,而不适用于相交和区分联合而不是正则联合),并且never
类型为0 。但是希望这能使人们对为什么编译器具有这种行为有足够的直觉。
请注意,TypeScript中还有一个top type,名为unknown
,在never
和A & unknown = A
中,其行为与A | unknown = unknown
的对偶完全相同,并且具有对偶集合论中的类似物(universal set/class)。但是您没有问这个,而且答案已经足够长了。