# 531-字符转联合

# 题目描述

实现一个将接收到的 String 参数转换为一个字母 Union 的类型。

例如

type Test = '123';
type Result = StringToUnion<Test>; // expected to be "1" | "2" | "3"

# 分析

这题属于转换类型的题目,之前做过的有 元组转联合,元组由于有索引签名可以直接通过 T[number] 转成联合。

对于字符,只能遍历一次,然后将每个字符拼起来形成联合即可。

# 题解

type StringToUnion<T extends string> = T extends `${infer F}${infer R}`
  ? // 遍历后,递归嵌套拼接成联合类型
    F | StringToUnion<R>
  : never;

//类似的,也可以实现字符串转元组
type StringToTuple<T extends string> = T extends `${infer F}${infer R}`
  ? // 遍历后,递归嵌套拼接成联合类型
    [F, ...StringToTuple<R>]
  : [];

这里值得一题的是,命中 false 之后的值,在转 联合时,是 never,而转元组时,是 []

前面多次提到过,T extends `${infer F}${infer R}` 当 T 是空字符时,此时会走 false 逻辑,当递归到最后一个字符时,R 就是空字符,此时就会命中 false 逻辑。

由于 A | never = A,所以转联合时选择 never。

[T, ...[]] = [T],所以转元组时选择 []

# 知识点

  1. 字符遍历套路: A extends `${infer F}${infer R}`
  2. infer 边界值
Last Updated: 2023/5/16 06:00:28