打字稿联合类型推断

时间:2017-06-05 11:17:19

标签: typescript

在以下情况下如何实现类型推断:

type a = {
    foo: number;
    bar: string;
}

type b = {
    foo: string;
}

let baz: a | b;

if (baz.foo === 5) {
    baz.bar = "abc"; // baz type is still a | b, should be a
}

2 个答案:

答案 0 :(得分:2)

显然无法从属性类型推断类型,因此您需要定义类型保护:

type a = {
    foo: number;
    bar: string;
}

type b = {
    foo: string;
}

let baz: a | b;

function isA(x: a | b): x is a {
    return typeof x.foo === 'number';
}

if (isA(baz) && baz.foo === 5) {
    baz.bar = "123";
}

isA类型后卫将告诉TypeScript您自己检查过baz类型。下面是使用强制转换实现此目的的另一种方法,但是在这里你仍然需要为每次使用强制转换baz,这可能不是最好的方法。

if ((baz as a).foo === 5) {
    (baz as a).z = "123";
}

有关类型保护的更多信息,请参阅the TypeScript docs

答案 1 :(得分:0)

  

baz类型仍然是| b,应该是

实际上,TypeScript编译器所做的是将所有统一类型(a | b)的属性访问限制为存在于所有统一类型上的属性,因此baz.bar甚至不编译,因为bar类型b上不存在。