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;
Коментарі