Typescript 类型脚本联合类型推断

Typescript 类型脚本联合类型推断,typescript,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 } 显然,无法从其属性的类型推断类型,因此需要定义类型保护: type a = { foo: n

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

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
}

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

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
type卫士将告诉TypeScript您已经选中了
baz
s type。下面是通过强制转换实现这一点的另一种方法,但在这里,您仍然需要为每个用法强制转换
baz
,这可能不是最好的方法

if ((baz as a).foo === 5) {
    (baz as a).z = "123";
}
有关类型保护的更多信息,请参阅

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


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

“如果我们有一个具有联合类型的值,我们只能访问联合中所有类型通用的成员。”