미니 타입 수준 경로 파서
경로를 타입이 지정된 매개변수 객체로 파싱합니다.
미니 타입 수준 경로 파서은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
목표
경로 파서를 만들어 "users/:id/posts/:postId"와 같은 경로를 읽고, 컴파일 시점에만 타입이 지정된 매개변수 객체 { id: string; postId: string }를 생성합니다. 이는 타입이 지정된 라우터에서 실제로 사용하는 패턴입니다.
type Params = ParseRoute<"users/:id/posts/:postId">;
// Goal: { id: string; postId: string }매개변수 인식
경로 세그먼트가 ":"으로 시작하면 매개변수입니다. 템플릿 리터럴로 이 접두사에 일치시키고 콜론 뒤의 매개변수 이름을 추론합니다.
표기법: 실제 TypeScript에서는 달러-중괄호 구멍이 포함된 백틱으로 구분된 문자열을 사용해 템플릿 리터럴 타입을 작성합니다. 이 코드 조각에서는 해당 패턴을 Tpl<...>로 표시하고 각 부분을 순서대로 나열합니다. 예를 들어 리터럴 접두사와 그다음 Rest에 일치하는 백틱 템플릿은 Tpl<'prefix', infer Rest>로 표시합니다.
type ParamName<S> = S extends Tpl<':', infer Name> ? Name : never;
// Tpl<...> denotes a backtick template literal type: a colon then Name
type X = ParamName<':id'>; // 'id'
type Y = ParamName<'users'>; // never경로 분할
먼저 Split 타입을 재사용하여 "/"에서 경로를 세그먼트로 분할합니다. 그런 다음 각 세그먼트를 리터럴 또는 매개변수로 처리합니다.
type Split<S extends string, Sep extends string> =
S extends Tpl<infer H, Sep, infer T> ? [H, ...Split<T, Sep>] : [S];
// Tpl<H, Sep, T> = a template literal type matching H, then Sep, then T
type Segs = Split<'users/:id', '/'>; // ['users', ':id']직접 템플릿 재귀
먼저 분할하지 않고 한 번에 하나의 세그먼트에 일치시켜 원본 문자열을 직접 파싱할 수도 있습니다. 다음 "/"까지 일치시키고, 해당 세그먼트를 처리한 다음 나머지 부분에 대해 재귀적으로 처리합니다.
type ParseRoute<S extends string> =
S extends Tpl<infer Seg, '/', infer Rest>
? SegParam<Seg> & ParseRoute<Rest>
: SegParam<S>;
// Tpl<Seg, '/', Rest> matches a segment, a slash, then the rest세그먼트별 매개변수
도우미는 하나의 세그먼트를 매개변수인 경우 속성 하나를 가진 객체로, 리터럴인 경우 빈 객체로 변환합니다.
type SegParam<S extends string> =
S extends Tpl<':', infer Name> ? { [K in Name]: string } : {};
// Tpl<':', Name> matches a colon followed by the param name
type X = SegParam<':id'>; // { id: string }
type Y = SegParam<'posts'>; // {}교차 타입으로 결합하기
각 세그먼트는 교차 타입을 통해 매개변수를 제공합니다. 교차 타입에서는 빈 객체가 사라지므로 최종 타입에는 실제 매개변수만 남습니다.
type Params = ParseRoute<"users/:id/posts/:postId">;
// { id: string } & {} & { postId: string } & {}
// = { id: string; postId: string }파싱 추적하기
"users/:id/posts/:postId"의 경우:
- 세그먼트 "users" -> {} , ":id/posts/:postId"에 대해 재귀 호출
- 세그먼트 ":id" -> { id: string }, "posts/:postId"에 대해 재귀 호출
- 세그먼트 "posts" -> {}, ":postId"에 대해 재귀 호출
- 세그먼트 ":postId" -> { postId: string }, 기본 사례
type Final = { id: string } & { postId: string };결과 정리
객체의 교차 타입은 읽기 불편하게 표시됩니다. "prettify" 도우미는 키에 대한 매핑 타입을 사용하여 이를 하나의 깔끔한 객체 타입으로 평탄화합니다.
type Prettify<T> = { [K in keyof T]: T[K] } & {};
type Clean = Prettify<ParseRoute<"users/:id">>; // { id: string }파서 사용하기
파싱된 타입을 함수에 연결하여 핸들러가 올바르게 타입이 지정된 매개변수를 받도록 합니다. 잘못된 키를 전달하면 컴파일 오류가 발생합니다.
declare function route<P extends string>(
path: P,
handler: (params: Prettify<ParseRoute<P>>) => void
): void;
route("users/:id", p => { const id: string = p.id; });타입이 지정된 매개변수의 이점
이제 컴파일러가 경로 문자열 자체에서 params를 도출합니다. 경로에서 매개변수 이름을 바꾸면 모든 핸들러가 예상 키를 자동으로 업데이트합니다. 수동 인터페이스가 필요 없고, 경로와 핸들러 사이에 불일치도 발생하지 않습니다.
route("users/:userId", p => {
const u = p.userId; // ok
// const x = p.id; // error: id does not exist
});파서 확장하기
이 미니 파서는 완전한 타입 지정 라우터의 씨앗입니다. 세그먼트별 도우미에 더 많은 템플릿 패턴을 추가하여 타입이 지정된 값(숫자 매개변수), 와일드카드, 선택적 세그먼트를 지원할 수 있습니다. 재귀 템플릿 구조는 그대로 유지됩니다.
type SegParam2<S extends string> =
S extends Tpl<':', infer N, '(number)'> ? { [K in N]: number }
: S extends Tpl<':', infer N> ? { [K in N]: string }
: {};
// Tpl<...> stands for a backtick template literal type pattern빠른 확인
경로 파서에 대한 이해도를 테스트해 보십시오.
복습
컴파일 시점에 동작하는 경로 파서를 만들었습니다.
- 재귀적인 템플릿 리터럴 추론으로 각 세그먼트에 일치시킵니다.
- 매개변수 세그먼트(
:name)는{ name: string }이 됩니다. - 리터럴 세그먼트는
{}가 되고 교차 타입에서 사라집니다. Prettify는 결과를 깔끔한 매개변수로 평탄화합니다.
다음은 25번 과정입니다: tRPC를 사용한 종단 간 타입 안전성
자주 묻는 질문
“미니 타입 수준 경로 파서” 강의는 무료인가요?
네 — “미니 타입 수준 경로 파서” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“미니 타입 수준 경로 파서”에서 뭘 배우나요?
경로를 타입이 지정된 매개변수 객체로 파싱합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“미니 타입 수준 경로 파서” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 파서 결합자 개념
- 타입 수준 문자열 분할
- 템플릿 리터럴로 파싱하기
- 미니 타입 수준 경로 파서