我需要递归地遍历数据结构并创建一个 type
,它根据条件将一些字段更改为不同的类型。
基于以下结构,我需要创建一个类型 (Result
),其中所有 A
类型都替换为 B
类型。
class A{}
class B{}
const data = {
propA:new AA,
propB:true,
nested:{
propC:new AA,
propD:false
}
}
// something like:
type Replace<typeof data, A, B>
// result
type Result = {
propA:B,
propB:boolean,
nested:{
propC:B
propD:boolean
}
}
最佳答案
您可以使用映射类型执行此操作,但请记住,匹配是基于对象结构而不是类名,因此当您'针对 A
。
Replace
类型可以定义为
type Replace<T, From, To> = T extends (...args: any[]) => any ? T : {
[K in keyof T]:
[T[K], From] extends [From, T[K]] ? To : Replace<T[K], From, To>
}
第一个条件是保留任何方法/函数属性,因为映射类型会将它们转换为 {}
。映射类型本身处理每个键,并检查值是否扩展了 From
类型和 From
类型扩展了值类型,以确保相等。如果两者相等,则将值替换为 To
,否则将递归调用 Replace
。
这是一个转换示例:
class A{}
class B{b = 42}
class C{}
const data = {
propA: new A(),
propBool: true,
propC: new C(),
nested:{
propA: new A(),
propBool: false
},
f: () => 42
}
type Result = Replace<typeof data, A, B>
// type Result = {
// propA: B;
// propBool: boolean;
// propC: B;
// nested: {
// propA: B;
// propBool: boolean;
// };
// f: () => number;
// }
关于typescript - 更改深层嵌套对象结构中的值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67170249/