给定以下类型:
interface FullName {
fullName?: string
}
interface Name {
firstName: string
lastName: string
}
type Person = FullName | Name;
const p1: Person = {};
const p2: Person = { fullName: 'test' };
const p3: Person = { firstName: 'test' }; // Does not throw
const p4: Person = { badProp: true }; // Does throw, as badProp is not on FullName | Name;
我希望p3
导致编译器错误,如firstName
存在而没有lastName
,但事实并非如此——这是一个错误还是预期的?
此外,将 FullName.fullName 设置为必需会导致p3
(and p1
) 导致错误。
首先,你的界面FullName
只包含一个可选属性,基本上使其匹配任何内容。然后,当您使用它进行联合类型时,生成的类型将与所有内容兼容。
However,考虑声明和分配文字对象还有另一个问题,那就是您只能声明已知的属性:为什么我收到错误“对象文字只能指定已知属性”?
所以你可以毫无问题地执行此操作:
var test = { otherStuff: 23 };
const p4: Person = test;
但不是这个
const p4: Person = { otherStuff: 23 };
在你的情况下firstName
是一个已知的属性FullName | Name
,所以一切都好。
正如@artem 回答的那样,discriminated unions
除了常规联合之外,在打字稿中具有特殊含义,需要特殊的结构假设。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)