ts多个type合并, 属性不唯一合并冲突问题

文章探讨了在TypeScript中遇到类型合并冲突的问题,提出了一种解决方案,利用infer递归和数组来实现不限个数的类型动态合并,特别是在属性有冲突时,将冲突属性变为联合类型。示例展示了如何从多个类型中合并属性,即使在存在相同键但不同类型的冲突情况下,也能得到预期的合并结果。
摘要由CSDN通过智能技术生成

问题描述

type复用时, 需要合并多个type, 合并时一个属性好几个type中有用到, 导致属性不唯一且类型也不相同, 使用&符号合并出来的属性类型为never,

//错误示例: 有冲突的合并
type type1 = {
  num: number
}
type type2 = {
  num: string
  bool: string,
  str: string
}
type type3 = {
  num: boolean,
  bool: boolean,
  str: string
}
type GetMerge  = type1&type2&type3  //合并结果是never;  内部bool与num合并冲突
//正常合并示例: 无冲突的合并
type type2 = {
  num:string
}
type type3 = {
  bool: boolean,
  str: string
}
type GetMerge = type2&type3
//合并结果为
// {
//   num:number,
//   bool:boolean,
//   str:string
// }
//目标结果, 无冲突正常合并, 有冲突则冲突属性变为联合类型,并且合并的类型个数动态, 即:合三个, 两个都可以 结果如下
type type1 = {
  num: number
}
type type2 = {
  num:string
}
type type3 = {
  num: boolean,
  bool: boolean,
  str: string
}
//合并结果为
// {
//   num:string|number|boolean,
//   bool:boolean,
//   str:string
// }


解决方案:

使用infer递归, 和数组实现不限个数, 冲突动态合并的效果, 代码实例如下

type type1 = {
  num: number
}
type type2 = {
  num:string
}
type type3 = {
  num: boolean,
  bool: boolean,
  str: string
}

//下面为实现部分

 //读取key值
type KeyofType<T> = keyof T  
//读取值, P为keyof出来的key值
type GetType<T,P> = P extends KeyofType<T> ? T[P]:never    
//结果类似 keyof type1 | keyof type2 | keyof type3
type MergeKeyType<T extends Array<any>> = T extends [infer X,...infer Rect]? KeyofType<X>|MergeKeyType<Rect>:never  
//结果类似(P extends keyof type1 ? type1[P]:never)|(P extends keyof type2 ? type2[P]:never), 例:P等于num,则结果为number|string|boolean
type MergeValueType<T extends Array<any>,P> = T extends [infer X,...infer Rect]? GetType<X,P>|MergeValueType<Rect,P>:never  
//合并整个值
type GetMerge<T extends Array<any>> = {
  [P in MergeKeyType<T>]:MergeValueType<T,P>
}




type ff = GetMerge<[type1,type2,type3]>  //调用合并, 数组内部合并对象可以动态个数例如[type1,type2]
// 合并结果为
// {
//   num:string|number|boolean,
//   bool:string|boolean,
//   str:string
// }

const cc:ff = {  //实例
  bool: true,
  str: "23232",
  num: 123
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值