단언과 타입 가드 비교
가능하면 단언보다 런타임 검사를 우선합니다.
단언과 타입 가드 비교은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
컴파일러를 설득하는 두 가지 방법
컴파일러가 값의 정확한 타입을 알지 못할 때는 두 가지 방법이 있습니다. 타입을 단언하거나(해당 타입이라고 주장하기) 타입을 검사할 수 있습니다(실행 시 타입을 증명하기). 두 방법은 비슷해 보이지만 안전성은 크게 다릅니다.
function viaAssert(v: unknown): number {
return (v as number) + 1; // claim
}
function viaGuard(v: unknown): number {
return typeof v === 'number' ? v + 1 : 0; // prove
}
console.log(viaAssert(5), viaGuard(5), viaGuard('x'));단언은 검증하지 않습니다
단언은 강제되지 않는 약속입니다. 틀렸다면 버그가 실행 시점까지 넘어갑니다. 단언은 편리함을 위해 안전성을 희생합니다.
const v: unknown = 'hello';
const n = v as number;
console.log(n.toFixed(2)); // runtime error: toFixed is not a function타입 가드는 실행 시 검증합니다
타입 가드는 실제로 값을 검사합니다. 검사를 통과하면 여러분과 컴파일러 모두 타입이 올바르다는 것을 알 수 있습니다. 타입 범위를 좁히는 과정을 뒷받침하는 실제 실행 시 검사가 있기 때문입니다.
function toFixed2(v: unknown): string {
if (typeof v === 'number') return v.toFixed(2);
return 'N/A';
}
console.log(toFixed2(3.14159), toFixed2('hi'));사용자 정의 타입 가드 함수
복잡한 검사를 재사용 가능한 가드로 캡슐화하고 value is T를 반환하게 하십시오. 충분히 검증된 하나의 검사만으로도 전체 코드가 이점을 얻습니다.
type Email = { address: string };
function isEmail(v: unknown): v is Email {
return typeof v === 'object' && v !== null &&
'address' in v && typeof (v as any).address === 'string';
}
console.log(isEmail({ address: 'a@b.com' }), isEmail(null));가드는 결합하고 재사용할 수 있습니다
가드는 일반 함수이므로 서로 결합하고, 검사하고, 재사용할 수 있습니다. 반면 단언은 흩어져 있는 주장이라 중앙에서 검증할 수 없습니다.
function isString(v: unknown): v is string { return typeof v === 'string'; }
function isNonEmpty(v: unknown): v is string {
return isString(v) && v.length > 0;
}
console.log(isNonEmpty('hi'), isNonEmpty(''));asserts를 사용하는 단언 함수
TypeScript는 단언 함수도 제공합니다. 이 함수의 반환 주석에는 asserts 키워드를 사용합니다. 함수가 정상적으로 반환되면 그 시점부터 컴파일러가 인수의 타입 범위를 좁힙니다. 조건이 충족되지 않으면 함수가 예외를 발생시킵니다.
function assertNumber(v: unknown): asserts v is number {
if (typeof v !== 'number') throw new Error('not a number');
}
function use(v: unknown): number {
assertNumber(v); // after this line, v is number
return v * 2;
}
console.log(use(21));asserts와 value is 비교
value is T 가드는 분기에서 사용할 불리언 값을 반환합니다. asserts value is T 함수는 실패할 때 예외를 발생시키고 이후 범위 전체에서 타입을 좁힙니다. 일반적인 as와 달리 두 방법 모두 실행 시 검사가 뒷받침됩니다.
function assertDefined<T>(v: T): asserts v is NonNullable<T> {
if (v === null || v === undefined) throw new Error('missing');
}
const maybe: string | null = 'ok';
assertDefined(maybe);
console.log(maybe.length); // narrowed to string범용 단언 도우미
단언 함수는 재사용 가능한 사전 조건을 만들기에 좋습니다. 하나의 assert(condition) 도우미로 코드 전체에서 불변 조건을 검사하고, 위반이 발생하면 조기에 예외를 발생시킬 수 있습니다.
function assert(cond: unknown, msg: string): asserts cond {
if (!cond) throw new Error(msg);
}
function half(n: number): number {
assert(n % 2 === 0, 'must be even');
return n / 2;
}
console.log(half(8));안전성 비교
가장 안전한 방법부터 가장 위험한 방법 순으로 보면, 타입 가드와 단언 함수(실행 시 검사됨)가 일반 as 단언(검사되지 않음)보다 안전하고, 일반 단언은 이중 단언(적극적으로 오해를 일으킴)보다 안전합니다. 상황에 맞는 가장 안전한 도구를 사용하십시오.
// Safe: guard
function safe(v: unknown) {
return typeof v === 'string' ? v.trim() : '';
}
console.log(safe(' hi '));알맞은 도구 선택하기
타입에 따라 분기할 때는 타입 가드를 사용하십시오. 사전 조건이 충족되어야 하거나 실행을 중단해야 할 때는 단언 함수를 사용하십시오. 타입 범위 좁히기로 처리할 수 없을 때(예: DOM 특수화)에만 as를 사용하십시오.
function getInput(v: unknown): asserts v is string {
if (typeof v !== 'string') throw new Error('expected string');
}
const raw: unknown = 'name';
getInput(raw);
console.log(raw.toUpperCase());실행 시 검사가 더 안전합니다
이 과정에서 반복해서 강조하는 주제는 단언보다 실행 시 검사를 우선하라는 것입니다. 가드와 단언 함수는 컴파일 시점의 타입과 실행 시 안전성을 모두 제공합니다. 단언은 주장만 제공합니다.
function parsePort(v: unknown): number {
if (typeof v === 'number' && Number.isInteger(v)) return v;
throw new Error('invalid port');
}
console.log(parsePort(8080));빠른 확인
단언과 타입 가드에 대한 이해도를 확인해 보십시오.
복습: 단언과 가드
다음 내용을 배웠습니다:
- 타입 가드(
value is T)는 실행 시 타입을 증명하고 분기할 수 있게 합니다. - 단언 함수(
asserts value is T)는 실패할 때 예외를 발생시키고 이후 타입 범위를 좁힙니다. - 일반적인
as단언은 타입을 주장할 뿐이며 실행 시 안전성을 제공하지 않습니다. - 실행 시 검사되는 도구를 우선하고, 타입 범위 좁히기로 처리할 수 없는 경우에만 단언을 사용하십시오.
다음 과정에서는 옵셔널 체이닝과 null 병합을 배웁니다.
function isPositive(v: unknown): v is number {
return typeof v === 'number' && v > 0;
}
console.log(isPositive(5), isPositive(-1));자주 묻는 질문
“단언과 타입 가드 비교” 강의는 무료인가요?
네 — “단언과 타입 가드 비교” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 타입 단언을 위한 as 키워드
- 비 null 단언 연산자
- 이중 단언과 위험성
- 단언과 타입 가드 비교