TypeScript Academy · Урок

Неизменяемые Builder-объекты

Возвращайте новые экземпляры Builder для более безопасного составления

Урок 4 из 413 шагов

«Неизменяемые Builder-объекты» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Изменяемость и неизменяемость

Рассмотренные ранее сборщики изменяют this и возвращают его. Неизменяемый сборщик, напротив, на каждом шаге возвращает новый экземпляр сборщика и никогда не изменяет исходный. Это делает композицию безопаснее.

Проблема общего изменяемого состояния

Если две части кода хранят один и тот же изменяемый сборщик, вызов одного метода установки влияет на обе части. Неизменяемые сборщики полностью устраняют этот неожиданный эффект общих ссылок.

const base = makeMutableBuilder().url("/x");
// If base is shared, later .method() calls mutate everyone's copy.

Возврат нового экземпляра

Неизменяемый метод установки копирует текущее состояние, добавляет новое поле и создаёт новый сборщик. Исходный сборщик не изменяется.

class IB<S> {
  constructor(private readonly d: Record<string, unknown> = {}) {}
  with<K extends string, V>(k: K, v: V): IB<S & Record<K, V>> {
    return new IB<S & Record<K, V>>({ ...this.d, [k]: v });
  }
}

Структурное совместное использование через разворачивание

Оператор разворачивания { ...this.d, [k]: v } копирует существующие записи и переопределяет один ключ. Неизменённые значения совместно используются по ссылке, поэтому копии создаются дёшево.

const a = new IB<{}>().with("url", "/x");
const c = a.with("method", "GET");
// a still only has url; c has url and method.

Исходные объекты никогда не изменяются

Поскольку каждый шаг создаёт новый объект, ответвление от более раннего сборщика безопасно. Вы можете повторно использовать частично собранную основу в разных местах.

const base = new IB<{}>().with("url", "/api");
const get = base.with("method", "GET");
const post = base.with("method", "POST");
console.log("base untouched; get and post diverge");

Внутреннее состояние только для чтения

Пометка внутренних данных как readonly документирует намерение и предотвращает случайные изменения на месте внутри класса. Единственный способ продолжить работу — создать новый экземпляр.

class IB<S> {
  constructor(private readonly d: Readonly<Record<string, unknown>> = {}) {}
}

Типизированная неизменяемая сборка

Параметр состояния по-прежнему передаётся через цепочку, поэтому мы можем ограничить build() так же, как раньше, но теперь на неизменяемой основе.

interface Out { url: string; method: string }
class IB<S> {
  constructor(private readonly d: Record<string, unknown> = {}) {}
  with<K extends string, V>(k: K, v: V): IB<S & Record<K, V>> {
    return new IB<S & Record<K, V>>({ ...this.d, [k]: v });
  }
  build(this: IB<{ url: string; method: string }>): Out { return this.d as Out; }
}
const out = new IB<{}>().with("url", "/u").with("method", "GET").build();
console.log(out.url);

Более безопасная композиция

Неизменяемые сборщики ведут себя как значения: передавайте их, создавайте на их основе новые и не беспокойтесь о том, что последующий вызов изменит общее состояние. Это то же преимущество, которое неизменяемые данные дают повсюду.

Повторно используемые преднастройки

Вы можете один раз сохранить часто используемую начальную точку и много раз создавать от неё ответвления. Благодаря методам установки с копированием при записи каждое ответвление независимо.

const jsonBase = new IB<{}>().with("header", "application/json");
const usersReq = jsonBase.with("url", "/users");
const ordersReq = jsonBase.with("url", "/orders");
console.log("two independent requests from one base");

Затраты

Каждый шаг выделяет память под новый объект. Для обычного построения конфигурации это несущественно, а структурное совместное использование сохраняет копии неглубокими. Это заметно только в чрезвычайно интенсивных циклах.

Сравнение изменяемых и неизменяемых сборщиков

Изменяемые сборщики немного быстрее и проще; неизменяемые безопаснее для совместного использования и анализа. Предпочитайте неизменяемые сборщики, когда их передают между частями кода или повторно используют как преднастройки.

Быстрая проверка

Быстрая проверка по этому уроку.

Повторение

Неизменяемый сборщик на каждом шаге возвращает новый экземпляр, используя структурное совместное использование через { ...this.d, [k]: v }, и никогда не изменяет this. Исходные объекты сохраняются, что обеспечивает безопасную композицию и повторно используемые преднастройки при небольших затратах на выделение памяти.

Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
101
Уроки
352

Часто задаваемые вопросы

Урок «Неизменяемые Builder-объекты» бесплатный?

Да — полный текст урока «Неизменяемые Builder-объекты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Неизменяемые Builder-объекты»?

Возвращайте новые экземпляры Builder для более безопасного составления Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Неизменяемые Builder-объекты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы шаблона Builder
  2. Плавные интерфейсы с типами
  3. Обязательные этапы
  4. Неизменяемые Builder-объекты
← Назад к TypeScript Academy