Mutable
Завдання
Реалізувати загальний тип Mutable<T>, який зробить всі властивості об’єкта
змінюваними. Наприклад:
interface Todo {
readonly title: string;
readonly description: string;
readonly completed: boolean;
}
// { title: string; description: string; completed: boolean; }
type MutableTodo = Mutable<T>;
Розв’язок
Й знову, завдання, яке складно назвати завдання з середнім рівнем складності. Я її вирішив без довгих роздумів й з першого разу. Але, як би там не було, ми все одно вирішуємо їх всі, тому навіщо думати про це.
Ми знаємо, що у нас на вході тип з властивостями, до якого застосовується
модифікатор readonly. Це ті ж самі модифікатори, які ми використовували для
розв’язку інших задач, наприклад Readonly. Але, в цьому
випадку, нас попросили прибрати цей модифікатор з вхідного типу.
Давайте почнемо з найпростішого. Скопіюємо вхідний тип без яких-небудь змін:
type Mutable<T> = { [P in keyof T]: T[P] };
Тепер у нас є копія T з модифікаторами readonly. Як же нам від них
позбутися? Пам’ятаєте, що ми використовували ключове слово readonly, щоб
додати їх до властивостей?
type Mutable<T> = { readonly [P in keyof T]: T[P] };
Неявно, TypeScript додає до цих ключових слів +. Тобто, застосовує модифікатор
readonly на властивості. Але, в нашому випадку, мы хочемо його відмінити, тому
використовуємо -:
type Mutable<T> = { -readonly [P in keyof T]: T[P] };
Таким чином, ми реалізували тип, який відміняє модифікатор readonly на
вхідному типі.
Коментарі