【问题标题】:Can I Override a Key in a TypeScript Interface?我可以覆盖 TypeScript 界面中的键吗?
【发布时间】:2017-03-05 14:43:57
【问题描述】:

我知道如何扩展 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' 不相同。

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

【问题讨论】:

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


    【解决方案1】:

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

    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 其中 address 的类型为 string [] 而不是 地址[]

    【讨论】:

    • 仅供参考,现在Pick&lt;T, Exclude&lt;keyof T, 'addresses'&gt;&gt; 也可以写成Omit&lt;T, 'addresses'&gt; 内置
    【解决方案2】:

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

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

    【讨论】:

    • 是的,联合和覆盖是不同的。在这种情况下,不应允许bar 成为number
    • 正确,但您不能覆盖属性
    • 这就是我害怕的。我会接受你的回答,因为答案实际上是“不”。
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2010-10-03
    相关资源
    最近更新 更多