컴파일 시점 입력 검증
런타임 전에 잘못된 DSL 표현식을 거부합니다.
컴파일 시점 입력 검증은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
컴파일 시점 입력 검증
타입 수준 DSL은 실행 전에 잘못된 형식의 표현식을 거부할 수 있습니다. 템플릿 리터럴 타입과 조건부 타입을 사용해 문자열의 구조를 타입 수준에서 검증하고 유효하지 않은 입력을 거부합니다.
예: 작은 선택자 언어
"user.name"이나 "order.items.length"와 같은 문자열을 받는다고 생각해 보세요. 컴파일 시점에 "user."나 ".name"을 거부하려고 합니다.
템플릿 리터럴로 구문 분석하기
템플릿 리터럴 타입은 infer를 사용해 문자열을 여러 부분으로 나눕니다. 이는 컴파일 시점 구문 분석의 기반입니다. 실제 패턴은 백틱으로 구분된 형태(머리, 점, 꼬리와 타입 추론 사용)이며, 이 분할 매처를 DotSplit으로 나타냅니다.
// Real TS: backtick pattern matching Head, ".", Tail.
type Split<S extends string> =
S extends DotSplit<infer Head, infer Tail>
? [Head, ...Split<Tail>]
: [S];
type P = Split<"a.b.c">; // ["a", "b", "c"]각 구간 검증하기
조건부 타입은 어떤 구간도 비어 있지 않은지 확인합니다. 빈 구간은 입력이 유효하지 않음을 나타냅니다. 같은 DotSplit 패턴(실제 코드에서는 백틱 템플릿 리터럴)이 재귀를 구동합니다.
type NonEmpty<S extends string> = S extends "" ? false : true;
type Valid<S extends string> =
S extends DotSplit<infer H, infer T>
? H extends "" ? false : Valid<T>
: NonEmpty<S>;
type V1 = Valid<"a.b">; // true
type V2 = Valid<"a.">; // false유효성에 따라 API 사용 제한하기
함수 매개변수를 제한하는 데 유효성 타입을 사용하십시오. 유효한 문자열은 해당 타입을 유지하고, 유효하지 않은 문자열은 never로 평가되므로 호출이 컴파일되지 않습니다.
declare function path<S extends string>(
p: Valid<S> extends true ? S : never
): void;
path("user.name"); // ok
path("user."); // Error: argument is never알 수 없는 토큰 거부하기
허용되는 문자도 제한할 수 있습니다. 알려진 세그먼트 패턴과 일치하는 것만 허용하고, 그 외의 값은 모두 거부하는 타입으로 축약됩니다.
type Allowed = "user" | "order" | "name" | "items";
type CheckSeg<S extends string> = S extends Allowed ? true : false;연산자 검증하기
"age > 18"과 같은 표현식 DSL에서는 템플릿 리터럴로 연산자를 일치시키고 허용된 집합에 포함되는지 확인합니다. 매처(왼쪽 공백 O 공백 오른쪽)는 실제 코드에서 백틱 템플릿 리터럴이며, 여기서는 CondMatch로 표시합니다.
type Op = ">" | "<" | "=" | ">=" | "<=";
// Real TS: backtick pattern -> left, " ", infer O, " ", right.
type IsCond<S extends string> =
S extends CondMatch<infer O>
? O extends Op ? true : false
: false;
type C1 = IsCond<"age > 18">; // true
type C2 = IsCond<"age ! 18">; // false검사 결합하기
실제 유효성 검사기는 여러 조건의 교집합을 사용합니다. 비어 있지 않은 세그먼트, 허용된 토큰, 균형 잡힌 구조 등이 그 예입니다. 각각은 조건부 타입이며, 논리식 도우미 타입으로 결합합니다.
type And<A, B> = A extends true ? (B extends true ? true : false) : false;재귀 제한
타입 수준 재귀에는 깊이 제한이 있습니다. 매우 긴 문자열의 경우 컴파일러가 "타입 인스턴스화가 지나치게 깊습니다"라는 오류를 표시할 수 있습니다. 분석할 입력의 길이를 제한하거나 문법을 단순화하십시오.
런타임 분석보다 나은 방법
런타임 분석기는 잘못된 문자열이 평가될 때만 문제를 보고합니다. 컴파일 시점 유효성 검사는 문자열 리터럴을 입력하는 즉시 거부하며, 편집기에서 완전한 피드백을 제공하고 런타임 비용은 전혀 발생시키지 않습니다.
중요한 이유
많은 DSL은 문자열 입력(경로, 쿼리, 형식)을 받습니다. 타입 시스템에서 그 구조를 검증하면 프로그램이 실행되기 전에 오타와 잘못 구성된 표현식을 찾아낼 수 있어, 런타임 오류의 한 부류를 컴파일 오류로 바꿀 수 있습니다.
빠른 확인
컴파일 시점 입력 유효성 검사에 대한 이해도를 확인하십시오.
복습
템플릿 리터럴 타입과 infer로 문자열 리터럴을 분석한 다음, 조건부 타입으로 세그먼트와 연산자를 검사하여 런타임 전에 DSL 입력을 검증했습니다. 함수 매개변수를 유효성 타입에 따라 제한하면 잘못된 표현식이 never로 평가되어 컴파일에 실패합니다. 이때 재귀 제한에 유의해야 합니다.
자주 묻는 질문
“컴파일 시점 입력 검증” 강의는 무료인가요?
네 — “컴파일 시점 입력 검증” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“컴파일 시점 입력 검증”에서 뭘 배우나요?
런타임 전에 잘못된 DSL 표현식을 거부합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“컴파일 시점 입력 검증” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 타입 수준 DSL이란 무엇인가
- 유창한 쿼리 DSL 설계
- 컴파일 시점 입력 검증
- 타입 수준 DSL의 오류 메시지