扩展具有一组值的属性的接口

时间:2020-03-08 18:36:30

标签: typescript

我有这个界面:


type Abc = "a" | "b" | "c"

interface Foobar_1_0 {
  fooBar: Abc;
  otherProp: number;
}

interface Foobar_1_1 extends Foobar_1_0 {
  fooBar: Abc | "d" | "e" | "f"
}

我的愿望是让Foobar_1_1的foo属性成为a,b,c,d,e,f之一,并通过扩展名继承otherProp。但是,它不起作用,该如何实现?

1 个答案:

答案 0 :(得分:1)

您面临的问题是Foobar_1_1不是Foobar_1_0的子集,因为fooBar中的属性Foobar_1_1比原始类型具有更宽的类型。对于联合类型,子集具有相同或更少的变体。因此,例如a | ba | b | c的子集,但对于您而言,这是另一回事。考虑一下证明:

type ExtendsAbc = Abc | "d" | "e" | "f" extends Abc ? true : false 
// false it doesn't extend

上面明确指出您的类型没有扩展原始类型,这就是为什么会发生错误。

为了扩展所有属性,但使属性fooBar变宽,我们可以在扩展Omit实用程序类型时忽略此属性,请考虑:

interface Foobar_1_1 extends Omit<Foobar_1_0, 'fooBar'> {
  fooBar: Abc | "d" | "e" | "f"
}

现在界面可以使用了,并且fooBar属性无法从fooBar扩展Foobar_1_0