Чистые функции и неизменяемость
Пишите предсказуемые функции без побочных эффектов
«Чистые функции и неизменяемость» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Чистые функции и неизменяемость
- Каррирование и частичное применение
- Композиция функций с типами
- Типизированные утилиты pipe и flow