TypeScriptУрок 11 из 16

readonly и утилитарные типы

Утилитарные типы строят новый тип из существующего, так что описывать его заново не нужно. Это встроенные в TypeScript дженерики.

Главное

  • Readonly<T> и поле readonly запрещают перезапись.
  • Partial<T> делает все поля необязательными — удобно для обновлений.
  • Pick<T, "a" | "b"> оставляет только перечисленные поля, Omit<T, "id"> убирает их.
  • Record<K, V> — объект с ключами K и значениями V.
  • readonly string[] — массив без push и других изменяющих методов.

Пример

interface Profile {  readonly id: number;  name: string;  email: string;} type ProfileUpdate = Partial<Profile>; // every field becomes optionaltype PublicProfile = Pick<Profile, "id" | "name">; // only these two fieldstype NewProfile = Omit<Profile, "id">; // everything except idtype Scores = Record<string, number>; // keys are strings, values are numbers const patch: ProfileUpdate = { name: "Sam" };const card: PublicProfile = { id: 7, name: "Sam" };const draft: NewProfile = { name: "Kim", email: "kim@example.com" };const scores: Scores = { math: 5, art: 4 };// card.id = 8; // error: 'id' is read-only const week: readonly string[] = ["Mon", "Tue"];// week.push("Wed"); // error: push does not exist on readonly string[] console.log(`${patch.name} #${card.id}, ${draft.name}, math ${scores.math}, ${week.length} days`);

Из одного Profile получились четыре типа, и ни одно поле не описано дважды. Если Profile изменится, производные типы обновятся сами.

Задание

Как пользоваться редактором⌘ Enter или Ctrl Enter — запустить код, ⇧ ⌘ Enter — проверить задание.Tab и Shift Tab сдвигают строку или выделение; Esc, затем Tab — выйти из редактора.Проверка сравнивает то, что напечатала программа, с заданием; пробелы в конце строк не важны.После двух неудачных проверок можно открыть решение. Ваш код сохраняется в этом браузере.

Сделайте defaults доступным только для чтения, patch — Partial, а summary — Pick из двух полей, добавьте titles через Record и выведите «Default: light, 16px», «Mine: dark, 18px», «Night mode».

Вывод

Здесь появится то, что напечатает программа.