2个接口的Typescript联合允许模糊代码

时间:2017-11-08 09:47:43

标签: typescript interface polymorphism union

我想要一个数组强制执行以下两种类型中的一种: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
];

谢谢:)

1 个答案:

答案 0 :(得分:0)

打字稿没有名义类型,只有结构类型。 这意味着{x:string,y:string}是一个非常精细的Foo(它有一个匹配类型的x键,任何需要Foo的代码都可以安全地忽略其他键)

如果要强制执行并模拟名义类型,可以为类型添加唯一标记:

interface Foo {
  _type: 'Foo'
  x: string
}

创建一个功能,轻松创建Foo&#34;实例&#34;使用正确的_type标记。