타입 단언
TypeScript에서 개발자가 컴파일러보다 특정 값의 타입을 더 잘 알고 있음을 알려주는 문법입니다.
핵심 특징
- 컴파일 단계 힌트: 런타임 변환이 아니라 타입 검사 단계에서만 영향을 줌
- 타입 좁히기 보조: DOM API처럼 넓은 타입으로 추론되는 값을 구체 타입으로 다룰 때 사용
- 안전성 책임 이동: 컴파일러가 보장하지 못하는 부분을 개발자가 책임짐
- 과사용 주의: 잘못된 단언은 실제 런타임 오류를 숨길 수 있음
기본 문법
const element = document.getElementById("app") as HTMLDivElement;
element.style.backgroundColor = "blue";
document.getElementById()의 반환 타입은 HTMLElement | null입니다. 개발자가 해당 요소가 HTMLDivElement임을 확신할 때 as HTMLDivElement로 단언할 수 있습니다.
타입 단언이 필요한 경우
타입 단언은 컴파일러의 타입 추론이 실제 코드의 의도를 충분히 표현하지 못할 때 사용합니다.
type Fish = { swim: () => void };
type Bird = { fly: () => void };
function isFish(pet: Fish | Bird) {
return (pet as Fish).swim !== undefined;
}
다만 가능한 경우에는 타입 단언보다 타입 가드나 조건문을 이용해 타입을 좁히는 편이 더 안전합니다.
타입 단언 vs 타입 가드
| 항목 | 타입 단언 | 타입 가드 |
|---|---|---|
| 방식 | 개발자가 타입을 주장 | 조건문으로 타입을 검증 |
| 런타임 검사 | 없음 | 가능 |
| 안정성 | 낮을 수 있음 | 상대적으로 높음 |
| 사용 예 | DOM 요소 캐스팅 | union 타입 분기 |
주의사항
as는 실제 객체를 변환하지 않음null가능성이 있는 값에 무작정 단언하면 런타임 오류가 날 수 있음- 전체 객체보다 필요한 분기에서 최소 범위로 단언하는 것이 좋음
- 가능하면 타입 단언보다 타입 좁히기, 타입 가드, 제네릭을 우선 고려
핵심 정리
타입 단언은 컴파일러에게 “이 값은 이 타입으로 봐도 된다”고 알려주는 문법입니다.
편리하지만 런타임 검증은 하지 않으므로, 확실한 근거가 있을 때 최소 범위에서 사용하는 것이 좋습니다.