Завдання

Реалізувати 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;

Посилання