Typescript 嵌套对象结构 Conditional/Recursion 类型
Typescript Nested Object Structure Conditional/Recursion Type
我有以下类型:
type Config = {
key: string,
label?: string,
value?: any,
}
我希望能够解析这些“配置”的深层嵌套对象。像这样:
feature1: {
field1: {
key: `field1`,
},
field2: {
key: `field2`,
},
},
feature2: {
group1: {
field: {
key: `group1_field`,
},
},
group2: {
field: {
key: `group2_field`,
},
},
},
feature3: {
group1: {
subgroup1: {
field: {
key: `group1_subgroup1_field`,
},
},
subgroup2: {
field: {
key: `group1_subgroup2_field`,
},
},
},
},
配置可以出现在对象的任何深度。
我将如何编写一个 Typescript 类型来处理这个结构?
到目前为止我一直在研究这段代码:
type Config = {
key: string,
label?: string,
value?: any,
}
type ConfigMapping = {
[key: string]: Config
}
export type NestedConfig<T> = T extends Config ? Config : {
[K in keyof T]:
T[K] extends (infer U)[] ? NestedConfig<U>[] :
NestedConfig<T[K]>;
}
这还没有按照我想要的方式工作。我有点不清楚如何创建这个嵌套类型。
由于您只想递归地对 Config
节点类型进行约束,我们可以使用 NConfig 类型别名 -
type Config = {
key: string,
label?: string,
value?: any,
}
type NConfig = Config | Config[] | { [key: string]: NConfig }
let x: NConfig = {
feature1: {
field1: {
key: `field1`,
},
field2: {
key: `field2`,
label: 'hey'
},
},
feature2: {
group1: {
field: [{
key: `group1_field`,
}],
},
group2: {
field: {
key: `group2_field`,
},
},
},
feature3: {
group1: {
subgroup1: {
field: {
key: `group1_subgroup1_field`,
},
},
subgroup2: {
field: {
key: `group1_subgroup2_field`,
},
},
},
},
}
我有以下类型:
type Config = {
key: string,
label?: string,
value?: any,
}
我希望能够解析这些“配置”的深层嵌套对象。像这样:
feature1: {
field1: {
key: `field1`,
},
field2: {
key: `field2`,
},
},
feature2: {
group1: {
field: {
key: `group1_field`,
},
},
group2: {
field: {
key: `group2_field`,
},
},
},
feature3: {
group1: {
subgroup1: {
field: {
key: `group1_subgroup1_field`,
},
},
subgroup2: {
field: {
key: `group1_subgroup2_field`,
},
},
},
},
配置可以出现在对象的任何深度。
我将如何编写一个 Typescript 类型来处理这个结构?
到目前为止我一直在研究这段代码:
type Config = {
key: string,
label?: string,
value?: any,
}
type ConfigMapping = {
[key: string]: Config
}
export type NestedConfig<T> = T extends Config ? Config : {
[K in keyof T]:
T[K] extends (infer U)[] ? NestedConfig<U>[] :
NestedConfig<T[K]>;
}
这还没有按照我想要的方式工作。我有点不清楚如何创建这个嵌套类型。
由于您只想递归地对 Config
节点类型进行约束,我们可以使用 NConfig 类型别名 -
type Config = {
key: string,
label?: string,
value?: any,
}
type NConfig = Config | Config[] | { [key: string]: NConfig }
let x: NConfig = {
feature1: {
field1: {
key: `field1`,
},
field2: {
key: `field2`,
label: 'hey'
},
},
feature2: {
group1: {
field: [{
key: `group1_field`,
}],
},
group2: {
field: {
key: `group2_field`,
},
},
},
feature3: {
group1: {
subgroup1: {
field: {
key: `group1_subgroup1_field`,
},
},
subgroup2: {
field: {
key: `group1_subgroup2_field`,
},
},
},
},
}