首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么穷举检查对联合类型的工作方式不同?

为什么穷举检查对联合类型的工作方式不同?
EN

Stack Overflow用户
提问于 2019-01-31 06:38:20
回答 1查看 75关注 0票数 3

我使用了TypeScript Deep Dive中描述的穷举检查

与不是联合类型的类型相比,联合类型的穷举检查的工作方式似乎不同。为什么??

例如,在下面的代码中,请注意,只有当我们断言x.kindnever时,exhaustivenessCheck1才能工作(不会在不应该输入error时输入error)。

然而,只有当我们断言xnever时,exhaustivenessCheck2才会做正确的事情。

代码语言:javascript
复制
type Variant1 = {
    kind: 1 | 2
}

type Variant2 = {
    kind: 1
} | {
    kind: 2
}

const x: Variant1 = { kind: 1 };


function exhaustivenessCheck1(x: Variant1) {
    switch (x.kind) {
        case 1:
        case 2:
            break;
        default:
            const _x: never = x.kind; // OK
            const _y: never = x; // Error
    }
}

function exhaustivenessCheck2(x: Variant2) {
    switch (x.kind) {
        case 1:
            break;
        case 2:
            break;
        default:
            const _x: never = x.kind; // Error
            const _y: never = x; // OK
    }
}

TypeScript Playground link (be sure to enable "strict null checks")

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-31 07:11:19

使用类型保护时,Typescript会缩小联合范围。混淆的原因在于联盟在哪里。

Variant1中,联合在kind成员上,所以typescript将联合缩小到default分支上的never。这意味着x仍然是Variant1类型,kind仍然可以在x上访问,只是此时kind的类型是never

Variant2中,联合是在x参数本身上进行的,所以x是缩小范围的部分。这个版本也被称为区分联合,其中kind是鉴别器。由于已经检查了所有kinds,因此在default上,x的范围将缩小为never,因此访问kind将成为一个错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54450629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档