Capitalize
Завдання
Реалізувати Capitalize<T>
, який робить першу літеру рядкового літерала
великою. Наприклад:
type capitalized = Capitalize<"hello world">; // expected to be 'Hello world'
Розв’язок
Спочатку, я не зрозумів завдання. Ми не можемо реалізувати загальний розв’язок
для того, щоб зробити літеру великою. Тому, TypeScript компілятор надає
вбудований тип Capitalize
, за допомогою якого ця проблема вирішується досить
легко:
type MyCapitalize<S extends string> = Capitalize<S>;
Але я сумніваюся, що задум автора був саме в цьому. Якщо ми не можемо
використовувати вбудований тип Capitalize
, то ми не можемо реалізувати
загальний розв’язок. А якщо загальний розв’язок реалізувати не виходить, то як
ми можемо зробити літери великими? Звичайно ж, за допомогою словників!
Щоб розв’язок був компактним, зробимо словник тільки для тих літер, які потрібні для того, щоб пройти тести.
interface CapitalizedChars {
f: "F";
}
Є словник з великими літерами. Давайте тепер виведемо першу літеру із рядкового літерала. Для цього, скористаємося класичною інструкцією з умовним типом.
type Capitalize<S> = S extends `${infer C}${infer T}` ? C : S;
В тип-параметрі C
отримуємо першу літеру, а в T
- решту рядка. Перевіримо,
чи існує перша літера в нашому словнику. Якщо так, то повертаємо велику літеру
зі словника, в іншому випадку — першу літеру без змін.
interface CapitalizedChars {
f: "F";
}
type Capitalize<S> = S extends `${infer C}${infer T}`
? `${C extends keyof CapitalizedChars ? CapitalizedChars[C] : C}${T}`
: S;
Коментарі