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
на
вхідному типі.
Коментарі