挑战

实现 StringToUnion 类型。它接收 string 类型参数,输出其所有字符的联合 (union)。

For example: 比如:

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

解答

在这个挑战中,我们需要遍历每个字符并把它加到联合(union)中。遍历字符串很容易, 我们需要做的是推断出字符串的两个部分,首字符和其余部分:

type StringToUnion<T extends string> = T extends `${infer C}${infer T}`
  ? never
  : never;

在这里,我们将获得 2 个类型参数 CT(字符和尾部)。为了继续遍历字符串,我 们递归地调用它并将尾部作为参数传入:

type StringToUnion<T extends string> = T extends `${infer C}${infer T}`
  ? StringToUnion<T>
  : never;

剩下的就是联合(union)本身了。我们需要添加第一个字符到联合(union)。在基本情况 下,StringToUnion会返回C | never,我们只需要将C添加到联合(union)中:

type StringToUnion<T extends string> = T extends `${infer C}${infer T}`
  ? C | StringToUnion<T>
  : never;

参考