Union undefined vs type guard

时间:2017-03-24 22:11:03

标签: typescript typescript2.0

给出严格的空检查和类似

的界面
export interface Foo {
    a?: string;
    b: string|undefined;
    c: string|null;
    d: string|undefined|null;
}
function bar(foo: Foo) { ... }

我希望a的行为与bcd相似。相反,我发现a的行为与所有这些行为都不同。

bar({b: undefined, c: null, d: undefined}); // works
bar({c: null, d: undefined}); // 'b' is missing in type '{...}'
bar({b: undefined, d: undefined}); // 'c' is missing in type '{...}'
bar({b: undefined, c: null}); // 'd' is missing in type '{...}'

这是预期的行为吗?有没有办法在没有?:语法的接口上实现可选属性行为?

2 个答案:

答案 0 :(得分:1)

  

这是预期的行为吗?

是的,我发现a comment on github确认了它的设计:

  

这是设计的。只有在声明属性时才能省略属性   用一个?改性剂。

此外,它不依赖于打开严格的空值检查。

  

有没有办法在a上实现可选的属性行为   没有?:语法的接口?

不,大概是因为有人可能会从你的例子中找到所有4种行为。

答案 1 :(得分:0)

在这种情况下,即使属性a采用相同类型的b,如果需要可选属性,仍需要使用?字符。

对于结构类型检查,类型string|undefined不能确保此属性是可选的。

所以,这是预期的行为。