4

我知道如何扩展 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”类型的命名属性“bar”不相同。

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

4

2 回答 2

5

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

type ExcludeAddress<T> = Pick<T, Exclude<keyof T, 'addresses'>>;

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

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

例子:

type ExcludeAddress<T> = Pick<T, Exclude<keyof 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[];
}

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

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

于 2019-07-11T23:41:26.597 回答
0

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

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

let c2: C = {
    foo: "string",
    bar: 4,
    baz: 3
};
于 2017-03-05T14:50:07.810 回答