首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子类型联合之间的流类型区分

子类型联合之间的流类型区分
EN

Stack Overflow用户
提问于 2018-03-01 20:21:03
回答 1查看 339关注 0票数 0

我有这个扩展子类型的联合示例:

代码语言:javascript
运行
复制
type TypeA = {|
    type: "a",
    value: number,
|};

type TypeB = {|
    type: "b",
    value: Array<number>,
|};

type SuperType =
    | TypeA & {|
        color: string,
    |}
    | TypeB;

function test(val: SuperType): void {
    if (val.type === "b") {
        // Flow should probably know that val.value is an array here
        console.log(val.value.length);
    }
}

(live flow.org/try link here)

但是,最后,当我尝试利用Disjoint Unions with exact types时,它失败了:

代码语言:javascript
运行
复制
20:         console.log(val.value.length);
                                 ^ Cannot get `val.value.length` because property `length` is missing in `Number` [1].
References:
3:     value: number,
              ^ [1]

我不知道是Flowtype不支持这个,还是我做错了什么。这发生在流0.66上。请注意,如果我删除了{| color: string |}位,这将起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 20:41:32

SuperType中,使用展开运算符...而不是交集运算符&

代码语言:javascript
运行
复制
type TypeA = {|
    type: "a",
    value: number,
|};

type TypeB = {|
    type: "b",
    value: Array<number>,
|};

type SuperType =
    | {|
        ...TypeA,
        color: string,
    |}
    | TypeB;

function test(val: SuperType): void {
    if (val.type === "b") {
        // Flow should probably know that val.value is an array here
        console.log(val.value.length);
    }
}

Live demo on Try Flow

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

https://stackoverflow.com/questions/49049633

复制
相关文章

相似问题

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