打字稿:扩展界面时类型中缺少索引签名

时间:2016-01-23 03:04:11

标签: typescript

我试图对我的某个接口进行扩展,但是在{dcs:Relationship}类型中使用以下代码段继续收到错误"索引签名:

interface Relationship {
    data: {
        id: string;
        type: string;
    }
}

interface T {
    relationships: {[key: string]: Relationship};
}

interface Test extends T {
    relationships: {
        dcs: Relationship;
    };
}

目标是将T中的relationships属性作为一个对象,其中任意数量的键都是关系类型。测试应该是T类型的特定实现。

不确定接近这个的正确方法是什么。提前谢谢!

2 个答案:

答案 0 :(得分:0)

像这样声明Test

interface Test extends T {
  relationships: {
    [key: string]: Relationship;
    dcs: Relationship;
  };
}

但是,正如您已经注意到,在实际实现接口时,最终必须再次声明索引器。你可以通过这样做来节省一些打字:

interface T {
  relationships: {
    [key: string]: Relationship;
  };
}

interface TestRelationships {
   [key: string]: Relationship;
   dcs: Relationship;
}

interface Test extends T {
  relationships: TestRelationships;
}

class T1 implements Test {
  relationships: TestRelationships;
}

答案 1 :(得分:0)

如果类型不必是接口,那么也是一种解决方案!是使用对象文字类型

((但是,将索引签名添加到接口可能是一个更好的选择))这表明我们也可以做到这一点!

例如:

export type SignalProcessorEvents =  {
    valueCandle: (
        value: WhalesCandle,
        storageType: StorageType | undefined
    ) => void
}

插图:

使用界面时(打字稿抱怨)

enter image description here

切换到对象文字时

enter image description here

想要查看的扩展代码:

export class Events<EventsObject extends { [eventName: string]: (...args: any[]) => void}> {
    protected _events: EventsObject = {} as any;