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



我有这样的深度嵌套对象(超过 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;
}

当我声明一个与Level1相同的Level1Transformed接口,但有Level3Transformed而不是Level3时,有没有办法重用所有中间接口(如Level2(?

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

编辑:不使用OR运算符?

  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>

你可以简单地给出OR operator level2

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

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

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

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[]>

最新更新