0Pricing
TypeScript Academy · Урок

Чистые функции и неизменяемость

Пишите предсказуемые функции без побочных эффектов

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

Что такое чистая функция?

Чистая функция возвращает один и тот же результат для одинаковых входных данных и не имеет побочных эффектов. Она не читает и не изменяет внешнее состояние, не изменяет свои аргументы и не выполняет операции ввода-вывода.

Пример чистой функции

Эта функция зависит только от своих аргументов и возвращает только результат. Её вызов никогда не изменяет ничего за пределами функции.

function add(a: number, b: number): number {
  return a + b;
}
console.log(add(2, 3)); // 5, always

Пример нечистой функции

Эта функция читает и изменяет переменную за пределами своей области видимости, поэтому её результат зависит от скрытого состояния, а сама она оставляет след. Поэтому функция нечистая.

let counter = 0;
function next(): number {
  counter += 1; // side effect
  return counter;
}
console.log(next(), next()); // 1 2, depends on history

Референциальная прозрачность

Чистый вызов обладает референциальной прозрачностью: его можно заменить результатом, не изменив программу. add(2, 3) можно в любом месте заменить на 5.

const x = add(2, 3) * 2;
const y = 5 * 2; // identical meaning
console.log(x === y); // true

Преимущества чистоты

Чистые функции легко тестировать (подготовка не требуется), легко кэшировать, безопасно выполнять параллельно и просто анализировать, поскольку у них нет скрытых зависимостей.

Не изменяйте аргументы

Изменение входного массива или объекта — побочный эффект, которого вызывающий код может не ожидать. Вместо этого создавайте и возвращайте новое значение.

// Impure: mutates input
function pushImpure(xs: number[], v: number) { xs.push(v); return xs; }
// Pure: returns a new array
function pushPure(xs: number[], v: number): number[] { return [...xs, v]; }

Неизменяемые обновления через разворачивание

Оператор разворачивания копирует объект или массив, позволяя переопределять поля, не затрагивая исходный объект. Это основной инструмент неизменяемых обновлений в TS.

interface User { name: string; age: number }
function birthday(u: User): User {
  return { ...u, age: u.age + 1 };
}
const before = { name: "Ada", age: 30 };
const after = birthday(before);
console.log(before.age, after.age); // 30 31

Неизменяемое обновление массивов

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

const nums = [1, 2, 3];
const doubled = nums.map(n => n * 2);
console.log(nums, doubled); // [1,2,3] [2,4,6]

readonly для безопасности

Пометка параметров как readonly сообщает компилятору и читателям, что функция не будет их изменять, поддерживая чистоту на уровне типов.

function sum(xs: readonly number[]): number {
  return xs.reduce((a, b) => a + b, 0);
}
console.log(sum([1, 2, 3])); // 6

Перенос эффектов на границы

Реальным программам нужны эффекты (журналирование, сеть). Функциональный стиль сохраняет ядро чистым и изолирует эффекты на границах, поэтому большая часть кода остаётся предсказуемой.

Мысленный контрольный список

Для каждой функции спросите себя: зависит ли она только от входных данных? Возвращает ли она только значение? Оставляет ли входные данные и внешний мир неизменными? Три положительных ответа означают, что функция чистая.

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

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

Повторение

Чистые функции зависят только от входных данных и не создают побочных эффектов, обеспечивая референциальную прозрачность. Используйте оператор разворачивания, map/filter и readonly для неизменяемых обновлений, а реальные эффекты переносите на границы программы.

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

Урок «Чистые функции и неизменяемость» бесплатный?

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

Чему я научусь в уроке «Чистые функции и неизменяемость»?

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

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

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

Сколько времени занимает урок «Чистые функции и неизменяемость»?

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

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

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

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

  1. Чистые функции и неизменяемость
  2. Каррирование и частичное применение
  3. Композиция функций с типами
  4. Типизированные утилиты pipe и flow
← Назад к TypeScript Academy