打字稿:合并/覆盖嵌套接口

时间:2018-04-06 12:40:30

标签: javascript typescript

我有这样的深层嵌套对象(超过3个级别):



{
    a1: 'foo1',
    b1: [
        {
            c2: 'foo2',
            d2: [
                {
                    e3: 'foo3',
                    f3: 'foo3'
                },
                {
                    e3: 'bar3',
                    f3: 'bar3'                    }
            ]
        }
    ]
};




我已经创建了嵌套接口,如下所示:



export interface Level3 {
    e3: string;
    f3: string;
}

export interface Level2 {
    c2: string;
    d2: Level3[];
}

export interface Level1 {
    a1: string;
    b1: Level2[];
}




我将最深层嵌套的对象转换为其他对象,同时保持上层结构的所有内容不变。例如:



export interface Level3Transformed {
    e3Transformed: number[];
    f3Transformed: number[];
}

export interface Level3 {
    e3: string;
    f3: string;
}




当我声明Level1Transformed接口与Level1相同但有Level3Transformed而不是Level3时,是否有任何方法可以重复使用所有接口之间(如Level2)?

或者是否有其他一些智能方法来构建/声明类似的嵌套对象,同时避免大量重复的接口?

编辑:不使用OR运算符?

3 个答案:

答案 0 :(得分:2)

  export interface Level2 {
     c2: string;
     d2: Level3[] | Level3Transformed[];
 }

或者您可以使用泛型类型:

 export interface Level2<T> {
   c2: string;
   d2: T[];
 }

 export interface Level1<T> {
   a1: string;
   b1: Level2<T>[];
 }

然后

  Level1<Level3>

 Level1<Level3Transformed>

答案 1 :(得分:2)

您只需在OR operator

中提供level2即可
export interface Level2 {
    c2: string;
    d2: Level3[] | Level3Transformed[];
}

这样,您的level1类型对象将为level3level3transformed类型。

答案 2 :(得分:1)

您可以使用模板类型,例如:

export interface Level3<T> {
    e3: T;
    f3: T;
}

export interface Level2<T> {
    c2: string;
    d2: Level3<T>[];
}

export interface Level1<T> {
    a1: string;
    b1: Level2<T>[];
}

然后您可以Level1<string>Level1<number[]>

如果您想更改Level3中的属性名称,则可以将整个Level3作为模板类型传递至Level2

请注意,您还可以为T定义默认值,例如export interface Level1<T=string>,那么您只能使用Level1作为字符串版本,或Level1<number[]>作为修改后的版本。