String to Union
Проблема
Реализовать StringToUnion<T>
, который принимает строчный тип литерал и
возвращает объединение из его символов. Например:
type Test = "123";
type Result = StringToUnion<Test>; // expected to be "1" | "2" | "3"
Решение
В этой проблеме нужно перебрать все символы из строчного тип литерала и добавить их в объединение. Начнём с первого - перебора. Воспользуемся условными типами со строчными тип литералами и выведем первую букву и остальную часть.
type StringToUnion<T extends string> = T extends `${infer C}${infer T}`
? never
: never;
В тип параметрах C
и T
получаем первую букву строки и её хвост. Чтобы
продолжить перебор, вызовем StringToUnion
снова с параметром T
. Таким
образом, будет происходить рекурсивный перебор.
type StringToUnion<T extends string> = T extends `${infer C}${infer T}`
? StringToUnion<T>
: never;
Единственное что осталось - объединение. На каждой итерации перебора, добавим
тип параметр C
к результату от StringToUnion<T>
. Так как базовый случай
StringToUnion<T>
это never
, получим C1 | C2 | CN | never
.
type StringToUnion<T extends string> = T extends `${infer C}${infer T}`
? C | StringToUnion<T>
: never;
Комментарии