Композиция функций с типами
Составляйте функции, сохраняя типобезопасность
«Композиция функций с типами» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Что такое композиция?
Композиция функций объединяет небольшие функции в одну более крупную. compose(f, g) создаёт функцию, которая сначала применяет g, а затем передаёт результат в f.
Основное определение
Математически compose(f, g)(x) = f(g(x)). Функции выполняются справа налево: сначала выполняется самая правая.
const compose = (f: (n: number) => number, g: (n: number) => number) =>
(x: number) => f(g(x));
const inc = (n: number) => n + 1;
const dbl = (n: number) => n * 2;
console.log(compose(inc, dbl)(5)); // 11 (5*2 then +1)Порядок справа налево
Порядок имеет значение. compose(inc, dbl) сначала удваивает, а затем увеличивает, тогда как compose(dbl, inc) сначала увеличивает. Читайте композицию изнутри наружу.
console.log(compose(dbl, inc)(5)); // 12 (5+1 then *2)Типизация композиции с помощью обобщений
Обобщения позволяют различать типы входных и выходных данных. g преобразует A в B, f преобразует B в C, а результат преобразует A в C.
function compose<A, B, C>(f: (b: B) => C, g: (a: A) => B): (a: A) => C {
return a => f(g(a));
}Изменение типов по ходу
Поскольку цепочка обобщений выглядит как A -> B -> C, композиция может преобразовывать значение, меняя его форму несколько раз, например из строки в число, а затем снова в строку.
const length = (s: string) => s.length;
const toStr = (n: number) => "len=" + n;
const describe = compose(toStr, length);
console.log(describe("hello")); // len=5Граница типов должна совпадать
Выходной тип g должен совпадать с входным типом f. Если они не совпадают, компилятор отклоняет композицию и заранее обнаруживает ошибки связывания.
// compose(length, toStr) would error:
// toStr returns string, length expects string -> ok here,
// but mismatched pairs are flagged by the compiler.Композиция трёх функций
Можно вложить композицию или написать вариант с тремя аргументами. Правило выполнения справа налево по-прежнему действует для всех таких вариантов.
const compose3 = <A, B, C, D>(
f: (c: C) => D, g: (b: B) => C, h: (a: A) => B
) => (a: A): D => f(g(h(a)));
const inc = (n: number) => n + 1;
const dbl = (n: number) => n * 2;
const neg = (n: number) => -n;
console.log(compose3(neg, dbl, inc)(3)); // -8Композиция создаёт конвейеры
Комбинируя небольшие чистые функции, Вы декларативно собираете сложные преобразования. Каждый элемент остаётся пригодным для отдельного тестирования.
const trim = (s: string) => s.trim();
const upper = (s: string) => s.toUpperCase();
const clean = compose(upper, trim);
console.log(clean(" hi ")); // HIПочему чистые функции лучше всего подходят для композиции
Композиция предполагает, что каждая функция зависит только от своих входных данных. Чистые функции гарантируют это, поэтому их композиция создаёт ещё одну предсказуемую чистую функцию.
compose против pipe
compose выполняется справа налево и соответствует математической записи. Многие предпочитают чтение слева направо — именно это обеспечивает pipe, который будет рассмотрен далее.
Делайте части небольшими
Композиция особенно эффективна, когда каждая функция выполняет одну небольшую задачу. Небольшие именованные чистые шаги делают собранный конвейер самодокументируемым и позволяют легко менять порядок шагов.
Краткая проверка
Краткая проверка по этому уроку.
Итоги
compose(f, g)(x) = f(g(x)) выполняется справа налево. Цепочка обобщённых типов A -> B -> C требует, чтобы выход g совпадал с входом f, позволяя компилятору проверять конвейер небольших чистых функций.
Часто задаваемые вопросы
Урок «Композиция функций с типами» бесплатный?
Да — полный текст урока «Композиция функций с типами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Композиция функций с типами»?
Составляйте функции, сохраняя типобезопасность Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Композиция функций с типами»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Чистые функции и неизменяемость
- Каррирование и частичное применение
- Композиция функций с типами
- Типизированные утилиты pipe и flow