타입 지정 pipe와 flow 유틸리티
정확한 추론을 지원하는 왼쪽에서 오른쪽 방향의 파이프라인을 구축합니다.
타입 지정 pipe와 flow 유틸리티은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
compose에서 파이프로
pipe는 값을 왼쪽에서 오른쪽으로 함수에 전달하며, 이는 대부분의 개발자가 선호하는 읽기 순서입니다. pipe(x, f, g)는 g(f(x))를 의미합니다.
두 단계 파이프
가장 단순한 파이프는 값과 함수 하나를 받아 결과를 반환합니다. 위에서 아래로 읽는 순서가 실행 순서와 일치합니다.
const pipe2 = <A, B>(a: A, f: (a: A) => B): B => f(a);
console.log(pipe2(5, n => n + 1)); // 6여러 함수에 차례로 전달하기
세 인자를 받는 파이프는 함수들을 순서대로 적용합니다. 각 단계의 출력이 다음 단계의 입력이 됩니다.
function pipe<A, B, C>(a: A, f: (a: A) => B, g: (b: B) => C): C {
return g(f(a));
}
const inc = (n: number) => n + 1;
const dbl = (n: number) => n * 2;
console.log(pipe(5, inc, dbl)); // 12왼쪽에서 오른쪽으로 읽기
compose와 달리 pipe는 단계가 실행되는 순서대로 나열됩니다. pipe(5, inc, dbl)은 작성된 그대로 먼저 증가시킨 다음 두 배로 만듭니다.
console.log(pipe(5, dbl, inc)); // 11 (double then inc)오버로드가 필요한 이유
호출하는 위치에 따라 전달하는 함수의 수가 달라집니다. 각 인자 수를 정확하게 타입 지정하려면 pipe에서 지원하는 길이마다 하나씩 오버로드 시그니처를 사용해야 합니다.
function pipe<A, B>(a: A, f: (a: A) => B): B;
function pipe<A, B, C>(a: A, f: (a: A) => B, g: (b: B) => C): C;
function pipe(a: unknown, ...fns: Function[]): unknown {
return fns.reduce((v, fn) => fn(v), a);
}각 오버로드가 타입을 연결합니다
두 함수 오버로드는 A -> B를 연결하고, 세 함수 오버로드는 A -> B -> C를 연결합니다. 컴파일러는 전달한 함수의 수에 따라 일치하는 오버로드를 선택합니다.
실행 시 구현
오버로드 아래에는 하나의 reduce가 모든 함수를 차례로 적용합니다. 구현 시그니처는 느슨한 타입을 사용하지만, 호출하는 쪽에는 정확한 오버로드가 보입니다.
function pipe(a: any, ...fns: Array<(x: any) => any>): any {
return fns.reduce((acc, fn) => fn(acc), a);
}
console.log(pipe(" hi ", s => s.trim(), s => s.toUpperCase())); // HI파이프를 따라 타입 바꾸기
각 오버로드가 제네릭을 연결하므로, 파이프는 완전히 타입 검사를 받으면서 값을 여러 타입으로 변환할 수 있습니다.
const out = pipe("hello", s => s.length, n => n > 3);
console.log(out); // true (string -> number -> boolean)flow: 값 없는 파이프
flow는 파이프와 비슷하지만 함수만 받아 새 함수를 반환합니다. 값은 나중에 전달하므로 재사용하기에 좋습니다.
const flow = <A, B, C>(f: (a: A) => B, g: (b: B) => C) =>
(a: A): C => g(f(a));
const process = flow((n: number) => n + 1, (n: number) => n * 2);
console.log(process(5)); // 12파이프, flow, compose 비교
pipe는 값을 왼쪽에서 오른쪽으로 함수에 적용하고, flow는 재사용 가능한 왼쪽에서 오른쪽 방향의 함수를 만들며, compose는 오른쪽에서 왼쪽 방향의 함수를 만듭니다. 읽는 순서와 재사용 여부에 따라 선택하시면 됩니다.
실용적인 파이프라인
fp-ts와 Effect 같은 라이브러리는 여러 오버로드를 갖춘 견고하고 완전히 타입이 지정된 pipe를 제공합니다. 직접 작은 파이프를 만들어 보면 타입 지정이 어떻게 동작하는지 정확히 알 수 있습니다.
간단 확인
이 레슨을 간단히 확인해 보겠습니다.
복습
pipe(x, f, g) = g(f(x))는 왼쪽에서 오른쪽으로 실행되며, 오버로드 시그니처를 사용해 각 인자 수를 정확하게 타입 지정하고 하나의 reduce 구현으로 처리합니다. flow는 재사용 가능한 함수를 반환하는 포인트 프리 변형입니다.
자주 묻는 질문
“타입 지정 pipe와 flow 유틸리티” 강의는 무료인가요?
네 — “타입 지정 pipe와 flow 유틸리티” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“타입 지정 pipe와 flow 유틸리티”에서 뭘 배우나요?
정확한 추론을 지원하는 왼쪽에서 오른쪽 방향의 파이프라인을 구축합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“타입 지정 pipe와 flow 유틸리티” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 순수 함수와 불변성
- 커링과 부분 적용
- 타입을 활용한 함수 조합
- 타입 지정 pipe와 flow 유틸리티