题目描述
实现一个将接收到的String参数转换为一个字母Union的类型。
例如
type Test = '123';
type Result = StringToUnion<Test>; // expected to be "1" | "2" | "3"
题解
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<StringToUnion<''>, never>>,
Expect<Equal<StringToUnion<'t'>, 't'>>,
Expect<Equal<StringToUnion<'hello'>, 'h' | 'e' | 'l' | 'l' | 'o'>>,
Expect<Equal<StringToUnion<'coronavirus'>, 'c' | 'o' | 'r' | 'o' | 'n' | 'a' | 'v' | 'i' | 'r' | 'u' | 's'>>,
]
// ============= Your Code Here =============
type StringToUnion<T extends string> =
T extends `${infer Head}${infer Tail}`
? Head | StringToUnion<Tail>
: never;
类型约束
使用T extends string对T进行约束,确保T是一个字符串类型
条件类型
type StringToUnion<T extends string> =
T extends `${infer Head}${infer Tail}`
? Head | StringToUnion<Tail>
: never;
-
如果
T不是空字符串:infer Head:将T的第一个字符类型推断为Headinfer Tail:将T的剩余字符串类型推断为TailHead | StringToUnion<Tail>:递归调用StringToUnion<Tail>继续处理剩余的字符串,并将Head与递归调用的结果合并为一个联合类型,最终返回合并后的联合类型
-
如果
T是空字符串:- 返回
never
- 返回