精炼打字稿脱节联合

时间:2019-02-27 14:53:01

标签: typescript disjoint-union

我正在尝试使以下内容起作用,但是打字稿在尝试访问o.foo属性时输出错误:

type Base = { s: string };
type Extra = { foo: string; };
type Other = { bar: string; };
type T = Base & (Extra | Other);

function f(o: T): string {
    if (typeof o.foo === 'string') {
        return o.s + o.foo;
    }
    return o.s + o.bar;
}

错误是

Property 'foo' does not exist on type 'T'.
  Property 'foo' does not exist on type 'Base & Other'.

看来打字稿无法正确推断,如果o具有foo属性(即字符串),则o的类型必须在{{1} }工会的分支机构。

有什么办法让它理解这一点?

1 个答案:

答案 0 :(得分:1)

除非他们是共同的,否则您不能访问工会的成员。您可以改用in字体保护符:

type Base = { s: string };
type Extra = { foo: string; };
type Other = { bar: string; };
type T = Base & (Extra | Other);

function f(o: T): string {
    if ('foo' in o) {
        return o.s + o.foo;
    }
    return o.s + o.bar;
}