在以下情况下如何实现类型推断:
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
}
答案 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
上不存在。