我需要递归地遍历数据结构并根据条件创建一个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
}
}
您可以使用映射类型执行此操作,但请记住,匹配基于对象结构而不是类名,因此class C{}
当您定位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;
// }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句