#独家
一个关于 TypeScript 联合类型拆解的问题?

2023-07-22 0 3,999

在 TypeScript 中如何将 (value: string | number) => void 类型转换为 ((value: string) => void) | ((value: number) => void) 类型?

更近一步的话希望可以:

// 要实现的高级类型
type Transform<T> = ....

// 原始类型
type Fn = (value: string | number | boolean) => void

// 转换后类型
type AfterFn =
  | ((value: string | number) => void)
  | ((value: string | boolean) => void)
  | ((value: number | boolean) => void)
  | ((value: string) => void)
  | ((value: number) => void)
  | ((value: boolean) => void)

补充:其实真实的情况是原始函数类型会有 n 个参数 (value: string | number, foo: any, baz: any) => void,但只需要拆分第一个参数。

感谢 @kkopite 提供的思路,在大佬的基础上处理了 boolean 类型联合分配时会拆分成 false 和 true 的问题:Playground(局限性;当类型本身为 false 或 true 时会转为 boolean

// 要实现的高级类型
type Transform<T extends (...args: any[]) => any> = 
  _ToFunc<_KeyCombos<Parameters<T>[0]>, ReturnType<T>>

type _KeyCombos<T, O = T> =
  T extends any
  ? [T] | (_KeyCombos<Exclude<O, T>> extends infer U extends any[]
    ? U extends U ? [T | U[number]] : never
    : never)
  : never

type _ToFunc<T extends Array<any>, R> = T extends any ? (val: T[0]) => R : never

type Fn = (value: string | number | boolean) => void

type a = Transform<Fn>

有个问题是boolean在分配的时候会变成truefalse,不大好处理


_KeyCombos的解释:

  1. T extends any ? [T] .. 表示使用union的分配特性,变成[string] | [number] | [boolean]
  2. (_KeyCombos<Exclude<O, T>> extends infer U extends any[]
    1. 假设当前分配的Tstring,相当于传入的是number | booleanextends infer U计算推断出来的U的类型为[number]|[boolean]|[number | boolean]
    2. extends any[]用来推断返回的U是数组,就可以通过U[number]拿到数组里面的union类型
    3. U extends U ? [T | U[number]] 在此用到union的分配特性,这里T是string的话,而U[number]|[boolean]|[number | boolean],一次就得到了[number | string]|[boolean | string]|[number | boolean | string]

ps: 实际上是没有boolean这个类型的,分配的时候会变成false|true,这个就不大好处理,没啥思路

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 一个关于 TypeScript 联合类型拆解的问题? https://www.jkxiazai.com/2177.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务