我想要一个数组强制执行以下两种类型中的一种:A或B,其中B扩展A.如何做到这一点?
interface Foo {
x: string;
}
interface Bar extends Foo {
y: string;
z: number;
}
type X = Foo | Bar;
const arr: Array<X> = [
{ x: 'Hello' }, // implements Foo
{ x: 'John', y: 'Doe', z: 42 }, // implements Bar
{ x: 'Hello', y: 'World' }, // i want this to throw an error
];
谢谢:)
答案 0 :(得分:0)
打字稿没有名义类型,只有结构类型。 这意味着{x:string,y:string}是一个非常精细的Foo(它有一个匹配类型的x键,任何需要Foo的代码都可以安全地忽略其他键)
如果要强制执行并模拟名义类型,可以为类型添加唯一标记:
interface Foo {
_type: 'Foo'
x: string
}
创建一个功能,轻松创建Foo&#34;实例&#34;使用正确的_type标记。