更改深度嵌套对象结构中的值类型

伊万 V。

我需要递归地遍历数据结构并根据条件创建一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用嵌套结构在 Swift 中解码深度嵌套的对象

如何使用Javascript从值数组中获取深度嵌套的对象结构

深度更改JavaScript对象中的值

JavaScript:更改给定路径的深度嵌套对象的所有值

如何使用 Python 在深度嵌套的结构中收集特定值

如何替换深度嵌套但任意的数据结构中的值?

更改嵌套对象的结构

在JavaScript中的对象数组中搜索深度嵌套的值

在javascript中按值类型将嵌套数组对象更改为对象

返回与深度嵌套的 Javascript 对象中的搜索键对应的值

在深度嵌套的对象数组中查找最大 id 值

更改嵌套对象值

Redux 更改深度嵌套数组的值

获取深度嵌套对象结构中的父级、祖级和键

从具有嵌套结构的字典中删除混合数据类型的空值和空对象

深度嵌套在结构数组中的单元格数组的访问值

计算深度嵌套的数组中对象的数量

在javascript中深度复制嵌套对象的数组

如何从深度嵌套对象的状态中删除?

从 JSON 中获取深度嵌套的对象

如何在SWIFT 5中更改对象结构的值

深度嵌套对象中未定义变量的默认值

如何在深度嵌套数组中查找具有 id 值的对象?

用javascript中的值返回所有深度对象的嵌套键的好方法

如何更改嵌套在节点树中的对象的属性值?

访问和更改不可变对象中的嵌套值

如何更改此嵌套对象数组中每个 id 的值?

比较深度嵌套的对象并将默认对象中的差异与其他属性(未更改)一起保存

在Go中更改结构类型