我可以覆盖 TypeScript 界面中的键吗?

jed*_*mao 5 overriding interface typescript type-definition typescript2.0

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

interface A {
    foo: string;
    bar: number;
}
Run Code Online (Sandbox Code Playgroud)

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

interface B {
    bar: string;
    baz: number;
}
Run Code Online (Sandbox Code Playgroud)

本质上,我想将这些接口合并为一个,给出以下接口:

interface C {
    foo: string; // from A.foo
    bar: string; // from B.bar (overrides A.bar)
    baz: number; // from B.baz
}
Run Code Online (Sandbox Code Playgroud)

我希望我能以某种方式扩展:

interface C extends A, B {}
Run Code Online (Sandbox Code Playgroud)

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

接口“C”不能同时扩展类型“A”和“B”。类型“A”和“B”的命名属性“bar”不相同。

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

Ale*_*ias 9

有点晚了......但我解决了这个问题,创建了另一种类型......

type ExcludeAddress<T> = Omit<T, 'addresses'>;
Run Code Online (Sandbox Code Playgroud)

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

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

例子:

type ExcludeAddress<T> = Omit<T, 'addresses'>;

export interface IAvailability {
    readonly frequency: number;
    readonly duration: number;
    readonly date: string;
    readonly addresses: Address[];
}

export interface ISerializedAvailability extends ExcludeAddress<IAvailability> {
    readonly addresses: string[];
}
Run Code Online (Sandbox Code Playgroud)

您需要调整我为您自己的个人项目创建的ExcludeAddress ...
也许这不是 cleaneast 解决方案,但是...它有效

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

  • 仅供参考,现在 `Pick&lt;T, Exclude&lt;keyof T, 'addresses'&gt;&gt;` 也可以写成 `Omit&lt;T, 'addresses'&gt;` 内置 (4认同)