PHpullh

TYPESCRIPT · 심층 가이드

TypeScript 함수형 완전 정리

합성과 커링은 값 수준에서는 몇 줄이면 되지만, TypeScript에서는 타입이 파이프라인을 따라 흘러가게 만드는 일이 구현의 절반 이상을 차지합니다.

주제 15개 · 예제 코드 포함 · 최종 수정 2026-08-30 · 작성 pullh 편집팀

TypeScript의 함수형 코드는 구조적 타이핑 위에 서 있습니다. 인터페이스 이름이 아니라 모양이 맞으면 통과하므로 작은 함수를 조립하기 좋지만, 대신 추론이 끊기는 지점이 눈에 잘 띄지 않습니다. composepipe를 직접 만들어 보면 이 사실이 분명해집니다. 인자 개수마다 오버로드를 얹거나 가변 튜플 제네릭을 쓰지 않으면 중간 단계의 타입이 unknown으로 뭉개져, 파이프라인 끝에서만 에러가 터집니다.

순수 함수불변 업데이트가 나머지 전부의 전제입니다. 여기서 만든 규칙을 값 흐름으로 바꾼 것이 composepipeline이고, 인자를 하나씩 고정하는 curried 함수는 그 파이프에 넣을 단항 함수를 만드는 도구입니다. 실패를 값으로 다루는 Result 스타일 매핑Maybe 스타일 처리는 마지막에 보는 편이 낫습니다. 앞의 합성 감각이 있어야 왜 예외 대신 반환값을 택하는지가 납득됩니다.

불변 업데이트에서 가장 흔한 착각은 스프레드가 깊은 복사라는 오해입니다. { ...state, count: 1 }은 한 겹만 새로 만들고 중첩 객체는 원본과 같은 참조를 공유하므로, 안쪽을 고치면 이전 상태까지 함께 변합니다. readonlyas const도 컴파일 타임 표시일 뿐 런타임에는 사라지니, 외부에 넘긴 배열이 변형되지 않는다는 보장은 되지 못합니다. 중첩 구조는 층마다 새 객체를 만들어 올려야 합니다.

01순수 함수

TypeScript에서 순수 함수 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// 순수 함수
const addTax = (price: number): number => price * 1.1;
console.log(addTax(10));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

02불변 업데이트

TypeScript에서 불변 업데이트 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// 불변 업데이트
const state = { page: 1, tags: ["x"] };
const next = { ...state, page: state.page + 1, tags: [...state.tags, "y"] };
console.log(next);
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

03Maybe 스타일 처리

TypeScript에서 Maybe 스타일 처리 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// Maybe 스타일 처리
const steps = [(value: number) => value + 1, (value: number) => value * 2];
console.log(steps.reduce((value, step) => step(value), 3));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

04Result 스타일 매핑

TypeScript에서 Result 스타일 매핑 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// Result 스타일 매핑
function* numbers() { yield 1; yield 2; yield 4; }
console.log([...numbers()]);
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

05fold 합계

TypeScript에서 fold 합계 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// fold 합계
const addTax = (price: number): number => price * 1.1;
console.log(addTax(50));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

06compose

TypeScript에서 compose 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// compose
const state = { page: 1, tags: ["x"] };
const next = { ...state, page: state.page + 1, tags: [...state.tags, "y"] };
console.log(next);
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

07partial 적용

TypeScript에서 partial 적용 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// partial 적용
const steps = [(value: number) => value + 1, (value: number) => value * 2];
console.log(steps.reduce((value, step) => step(value), 7));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

08curried 함수

TypeScript에서 curried 함수 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// curried 함수
function* numbers() { yield 1; yield 2; yield 8; }
console.log([...numbers()]);
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

09pipeline

TypeScript에서 pipeline 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// pipeline
const addTax = (price: number): number => price * 1.1;
console.log(addTax(90));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

10lazy iterator

TypeScript에서 lazy iterator 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// lazy iterator
const state = { page: 1, tags: ["x"] };
const next = { ...state, page: state.page + 1, tags: [...state.tags, "y"] };
console.log(next);
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

11패턴 분기

TypeScript에서 패턴 분기 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// 패턴 분기
const steps = [(value: number) => value + 1, (value: number) => value * 2];
console.log(steps.reduce((value, step) => step(value), 11));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

12reducer 상태 누적

TypeScript에서 reducer 상태 누적 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// reducer 상태 누적
function* numbers() { yield 1; yield 2; yield 12; }
console.log([...numbers()]);
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

13all predicate

TypeScript에서 all predicate 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// all predicate
const addTax = (price: number): number => price * 1.1;
console.log(addTax(130));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

14flatMap

TypeScript에서 flatMap 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// flatMap
const state = { page: 1, tags: ["x"] };
const next = { ...state, page: state.page + 1, tags: [...state.tags, "y"] };
console.log(next);
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

15함수 값을 반환하는 함수

TypeScript에서 함수 값을 반환하는 함수 개념을 코드로 빠르게 확인하는 함수형 예제입니다.

TypeScript code

// 함수 값을 반환하는 함수
const steps = [(value: number) => value + 1, (value: number) => value * 2];
console.log(steps.reduce((value, step) => step(value), 15));
알아두면 좋은 점

함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.

자주 하는 실수

원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.

정리하며

  • 스프레드는 한 겹만 복사하므로 중첩 상태는 경로를 따라 층마다 새로 만듭니다.
  • readonly는 컴파일 타임 표시이며 런타임 변형은 막지 못한다고 전제합니다.
  • compose는 오버로드나 가변 튜플 제네릭 없이는 중간 타입이 뭉개집니다.
  • 실패는 예외 대신 Result 형태의 반환값으로 두어 호출부가 분기하게 만듭니다.

더 깊이 들어가고 싶다면 TypeScript 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.