타입 수준 비교
전적으로 타입 수준에서 숫자를 비교합니다.
타입 수준 비교은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
숫자 비교하기
숫자 리터럴 타입을 비교할 때도 튜플을 활용합니다. 두 숫자를 같은 속도로 줄여 가며 어느 쪽이 먼저 0에 도달하는지 확인하는 방식입니다. 빈 튜플에 먼저 도달하는 쪽이 더 작은 숫자입니다.
type BuildTuple<N extends number, Acc extends unknown[] = []> =
Acc["length"] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>;리터럴의 동일성
숫자 리터럴이 같은지는 상호 할당 가능성으로 확인합니다. 두 리터럴이 서로의 확장 타입일 때 같습니다. 튜플로 감싸면 유니언으로 인한 예기치 않은 결과를 피할 수 있습니다.
type NumEquals<A extends number, B extends number> =
[A] extends [B] ? ([B] extends [A] ? true : false) : false;
type X = NumEquals<3, 3>; // true
type Y = NumEquals<3, 4>; // false줄여 가며 비교하기
A > B의 경우 두 숫자에 해당하는 튜플을 만들고, 단계마다 양쪽에서 요소를 하나씩 제거합니다. A에는 아직 요소가 남아 있는 동안 B가 먼저 비면 A가 더 큰 것입니다.
type GreaterThan<A extends number, B extends number> =
BuildTuple<A> extends [...BuildTuple<B>, unknown, ...unknown[]]
? true : false;
type X = GreaterThan<5, 3>; // true
type Y = GreaterThan<3, 5>; // false패턴 읽는 방법
[...BuildTuple<B>, unknown, ...unknown[]]이라는 패턴은 길이 B인 접두부 뒤에 적어도 하나 이상의 요소가 있다는 뜻입니다. A가 이 패턴에 맞으면 A의 요소 수가 B보다 많으므로 A > B입니다.
type A = GreaterThan<4, 4>; // false (no extra element)
type B = GreaterThan<6, 2>; // true작다
LessThan은 인수의 순서를 뒤집은 GreaterThan일 뿐입니다. 다시 유도하지 말고 재사용하세요.
type LessThan<A extends number, B extends number> =
GreaterThan<B, A>;
type X = LessThan<3, 5>; // true
type Y = LessThan<5, 3>; // false크거나 같음
비교와 동일성 검사를 결합합니다. A >= B는 A > B이거나 A == B일 때 참입니다.
type Gte<A extends number, B extends number> =
GreaterThan<A, B> extends true
? true
: NumEquals<A, B>;
type X = Gte<5, 5>; // true
type Y = Gte<3, 5>; // false재귀적 비교
두 숫자를 하나가 0에 도달할 때까지 함께 감소시켜 비교하는 방법도 있습니다. 이 방식은 같은 속도로 줄여 가는 개념을 명확하게 보여 줍니다. 먼저 0에 도달하는 쪽이 더 작습니다.
type Cmp<A extends number, B extends number> =
A extends 0
? (B extends 0 ? "eq" : "lt")
: B extends 0
? "gt"
: Cmp<Dec<A>, Dec<B>>;
type X = Cmp<3, 5>; // "lt"Dec 의존성
재귀 버전은 이전 레슨의 Dec가 필요합니다. 각 단계에서 양쪽의 표시를 하나씩 제거합니다. 둘 다 0이면 같고, 한쪽만 0이면 다른 쪽이 더 큽니다.
type Dec<N extends number> =
BuildTuple<N> extends [unknown, ...infer R] ? R["length"] : 0;동일성과 할당 가능성 비교
주의하세요. number extends number는 참이지만, 이는 리터럴이 같다는 뜻이 아닙니다. 여기서의 비교는 3과 5처럼 구체적인 리터럴 타입을 전제로 하며, 범용 number 타입을 전제로 하지 않습니다.
type A = NumEquals<3, 3>; // true
type B = 3 extends number ? 1 : 0; // 1 (assignability, not equality)정렬 기준 만들기
비교를 사용하면 순서 규칙을 표현할 수 있습니다. 예를 들어 두 숫자로 이루어진 튜플이 오름차순으로 정렬되어 있는지 타입 수준에서 결정할 수 있습니다.
type IsSorted<A extends number, B extends number> =
GreaterThan<A, B> extends true ? false : true;
type X = IsSorted<2, 5>; // true
type Y = IsSorted<5, 2>; // false신중하게 사용하기
비교에는 재귀 비용이 듭니다. 작은 범위로 제한된 값을 검증하는 데는 유용하지만, 일반적인 숫자 라이브러리는 아닙니다. 피연산자를 작게 유지하고, 전체 재귀보다 단계가 얕은 접두부 패턴 형식을 우선 사용하세요.
type A = GreaterThan<9, 4>; // true (cheap, prefix pattern)빠른 확인
타입 수준 비교를 제대로 이해했는지 테스트해 보세요.
복습
이제 타입 시스템에서 숫자의 순서를 정할 수 있습니다.
- 리터럴의 상호 할당 가능성을 통해 동일성을 확인합니다.
GreaterThan은 B 길이의 접두부와 추가 요소 하나를 통해 구현합니다.LessThan은 인수의 순서를 뒤집고,Gte는 동일성을 추가합니다.- 작은 리터럴 숫자에 사용할 수 있으며, 범용
number타입에는 사용할 수 없습니다.
다음: 이 모든 것을 실용적인 도구로 만들기입니다.
자주 묻는 질문
“타입 수준 비교” 강의는 무료인가요?
네 — “타입 수준 비교” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“타입 수준 비교”에서 뭘 배우나요?
전적으로 타입 수준에서 숫자를 비교합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“타입 수준 비교” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.