我有这个界面:
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
。但是,它不起作用,该如何实现?
答案 0 :(得分:1)
您面临的问题是Foobar_1_1
不是Foobar_1_0
的子集,因为fooBar
中的属性Foobar_1_1
比原始类型具有更宽的类型。对于联合类型,子集具有相同或更少的变体。因此,例如a | b
是a | 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
。