[TypeScript] Type Challenges #531 - String to Union

55 阅读1分钟

题目描述

实现一个将接收到的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 stringT进行约束,确保T是一个字符串类型

条件类型

type StringToUnion<T extends string> =
  T extends `${infer Head}${infer Tail}`
      ? Head | StringToUnion<Tail>
      : never;
  • 如果T不是空字符串:

    • infer Head:将T的第一个字符类型推断为Head
    • infer Tail:将T的剩余字符串类型推断为Tail
    • Head | StringToUnion<Tail>:递归调用StringToUnion<Tail>继续处理剩余的字符串,并将Head与递归调用的结果合并为一个联合类型,最终返回合并后的联合类型
  • 如果T是空字符串:

    • 返回never