我有这样的深度嵌套对象(超过 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
类型对象将是level3
或level3transformed
类型。
您可以使用模板类型,例如:
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[]>
。