例如:
interface a {
name: string
nested: {
lastName: string
nested: {
age: number
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望它变成:
interface b {
name: string
lastName: string
age: number
}
Run Code Online (Sandbox Code Playgroud)
接口值将是动态的,所以我可能需要某种递归解决方案
我最终只得到了有限的解决方案
这是使用映射和条件类型的解决方案:FlattenPairs构造一个像 的并集['name', string] | ['lastName', string] | ['age', number],然后Flatten将其转换为对象类型。我假设嵌套属性不一定全部命名nested(并且不一定具有可预测的属性名称),因此Primitive需要该类型作为递归的基本情况。
type Primitive = string | number | boolean
type FlattenPairs<T> = {[K in keyof T]: T[K] extends Primitive ? [K, T[K]] : FlattenPairs<T[K]>}[keyof T] & [PropertyKey, Primitive]
type Flatten<T> = {[P in FlattenPairs<T> as P[0]]: P[1]}
Run Code Online (Sandbox Code Playgroud)
例子:
interface TestInterface {
name: string
nested: {
lastName: string
nested: {
age: number
}
}
}
// {age: number, lastName: string, name: string}
type Test = Flatten<TestInterface>
Run Code Online (Sandbox Code Playgroud)
FlattenPairs如果嵌套属性名称已知,则可以以稍微简单的方式编写辅助类型:
type FlattenPairs<T> = {[K in keyof T]: K extends 'nested' ? FlattenPairs<T[K]> : [K, T[K]]}[keyof T]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2380 次 |
| 最近记录: |