我可以覆盖TypeScript接口中的密钥吗?

时间:2017-03-05 14:43:57

标签: typescript interface override typescript2.0 type-definition

我知道如何扩展TypeScript接口,但我在这里问的是如何 覆盖 接口中的特定键。例如,假设我有一个简单的界面A

interface A {
    foo: string;
    bar: number;
}

我还有另一个简单的界面B,也有一个bar键,但是有不同的类型:

interface B {
    bar: string;
    baz: number;
}

基本上,我想将这些接口合并为一个,给我以下界面:

interface C {
    foo: string; // from A.foo
    bar: string; // from B.bar (overrides A.bar)
    baz: number; // from B.baz
}

我希望我能以某种方式延伸:

interface C extends A, B {}

但是我不能,因为我得到了这个错误,这完全是预期的并且是设计的:

  

界面' C'不能同时扩展类型' A'和' B'。命名   物业'酒吧'类型' A'和' B'不一样。

我不确定是否还有另一种我不知道的机制。我不认为交叉点或联合类型在这里有帮助。

2 个答案:

答案 0 :(得分:1)

有点晚了...但是我解决了创建另一种类型的问题...

a = ['a','b','c']

此类型从界面中排除特定键(我称为“地址”)...

我用它来解决需要转换接口值的问题...
我删除了它,然后创建了一个扩展旧界面(没有键)的新界面+具有新keyType的界面...

示例:

'a' and 'b' and 'c'

您需要调整我为您自己的个人项目创建的 ExcludeAddress ...
也许这不是清洁的解决方案,但是...可以。

在我的示例中:我创建的 ISerializedAvailability 本质上是 IAvailability ,其中地址的类型为 string [] 而不是 Address []

答案 1 :(得分:0)

您可以使用联合类型:type C = A | B;,但这两种方法都可以正常工作:

let c1: C = {
    foo: "string",
    bar: "string",
    baz: 3
};

let c2: C = {
    foo: "string",
    bar: 4,
    baz: 3
};