# 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]
,所以转元组时选择 []
。
# 知识点
- 字符遍历套路:
A extends `${infer F}${infer R}`
- infer 边界值