微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么“从不”类型在联合类型中毫无意义?

如何解决为什么“从不”类型在联合类型中毫无意义?

Typescript playground

在尝试缠住以下事实时,我遇到了麻烦:never类型毫无意义,并且当它在 union类型内时可以将其丢弃。

我的意思是,我知道在一个交叉点类型中,never会立即使所有结果都生成never,因为任何类型和{{1} }的相同类型。这对我来说很有意义。

enter image description here

但是在 union类型中,我的直觉最初告诉我never类型将是有效的选项。我的问题是为什么呢?为什么never可以以联合类型丢弃?

enter image description here

有人可以对此给出合理的解释,以便我更好地理解吗?

解决方法

具体说明,变量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可以被视为{truefalse},该集合仅包含这两个值。并且string可以看作是(基本上)无限集,其中包含每个可能的string值。

在TypeScript中,neverbottom 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,在neverA & unknown = A中,其行为与A | unknown = unknown的对偶完全相同,并且具有对偶集合论中的类似物(universal set/class)。但是您没有问这个,而且答案已经足够长了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。