[Frontend] 타입 단언(Type Assertion)이란? 안전하게 사용하는 법
[Frontend] 타입 단언(Type Assertion)이란? 안전하게 사용하는 법
들어가며
타입 단언(Type Assertion)이란, 개발자가 컴파일러보다 타입을 더 정확히 알고 있다고 알려주는 방법입니다.
즉, 타입스크립트가 자동으로 추론한 타입 대신, 개발자가 명시적으로 “이 값은 이 타입이야!”라고 단언하는 것입니다. 가장 흔한 문법은 as
키워드를 사용하는 방식입니다.
1
const element = document.getElementById("myElement") as HTMLDivElement;
이 글에서는 타입 단언의 개념, 사용 시기, 주의사항, 그리고 더 안전하게 사용하는 팁까지 예제와 함께 알아보겠습니다.
목차
- 타입 단언이 필요한 이유
- 타입 단언 기본 문법
- 언제 타입 단언을 사용하나요?
- 주의할 점
- 안전하게 사용하는 팁
- 정리
- 참고 자료
1. 타입 단언이 필요한 이유
TypeScript는 타입을 자동으로 추론하지만, 항상 정확한 타입을 유추하지는 못합니다. 특히 DOM API, 외부 라이브러리, JSON 파싱 등에서는 타입이 모호할 수 있습니다.
예를 들어:
1
2
const el = document.getElementById("box");
el.style.backgroundColor = "blue"; // ❌ 오류 발생: el은 HTMLElement | null
el
은 HTMLElement | null
타입이기 때문에, 바로 style에 접근하면 오류가 발생합니다. 이럴 때 타입 단언을 사용하면 해결됩니다:
1
2
const el = document.getElementById("box") as HTMLDivElement;
el.style.backgroundColor = "blue"; // ✅ OK
2. 타입 단언 기본 문법
✅ as 문법
1
const name = "Jungwoo" as string;
✅ 꺾쇠 문법 ()
1
const age = <number>25;
⚠️ 꺾쇠 문법은 JSX 환경(React 등)에서는 문법 충돌이 발생할 수 있으므로 보통 as
문법을 추천합니다.
3. 언제 타입 단언을 사용하나요?
- DOM 조작 시:
getElementById
,querySelector
등에서 반환값이HTMLElement | null
일 때 - 외부 라이브러리: 타입 정의가 부정확하거나 없을 경우
- JSON 파싱:
JSON.parse()
는any
를 반환하므로 명시적인 타입이 필요할 때 - 명확하게 타입이 확실한 경우: 실제 값이 어떤 타입인지 개발자가 100% 확신할 때
예시: DOM 요소 단언
1
2
const input = document.querySelector("#username") as HTMLInputElement;
input.value = "정우";
예시: JSON 파싱
1
2
3
type User = { name: string; age: number };
const json = '{"name":"정우","age":30}';
const user = JSON.parse(json) as User;
4. 타입 단언의 주의점 😱
타입 단언은 컴파일러의 타입 검사를 우회합니다. 잘못된 타입을 단언하면 런타임 오류로 이어질 수 있습니다.
1
2
const el = document.getElementById("box") as HTMLCanvasElement;
el.getContext("2d"); // ❌ HTMLElement라면 에러 발생
따라서 “확실한 경우에만” 타입 단언을 사용해야 하며, 가능하면 타입 내로잉, 타입 가드 등의 더 안전한 방식을 우선적으로 사용하는 것이 좋습니다.
5. 안전하게 사용하는 팁 ✅
1. 타입 내로잉을 우선 사용하기
1
2
3
4
5
6
7
function printLength(value: string | string[]) {
if (Array.isArray(value)) {
console.log(value.length); // ✅ 배열로 안전하게 처리
} else {
console.log(value.length); // ✅ 문자열로 안전하게 처리
}
}
2. 타입 가드(type predicate) 사용하기
1
2
3
4
5
6
7
8
9
10
11
type Fish = { swim: () => void };
type Bird = { fly: () => void };
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
const pet: Fish | Bird = getPet();
if (isFish(pet)) {
pet.swim(); // ✅ 안전하게 swim 호출
}
3. 필요한 부분만 단언하기
전체 객체보다는 접근하려는 속성이나 부분만 단언하는 것이 안전합니다.
1
2
3
4
const el = document.getElementById("box");
if (el) {
(el as HTMLDivElement).style.color = "red"; // ✅ 최소 범위 단언
}
6. 정리
항목 | 설명 |
---|---|
타입 단언이란? | 컴파일러의 타입 추론을 개발자가 덮어쓰는 기능 |
언제 사용? | 컴파일러가 타입을 추론하지 못하거나, 외부 API 결과가 명확할 때 |
문법 | as 타입, <타입> (비추천) |
주의사항 | 잘못된 단언은 런타임 오류 유발 |
대안 | 타입 내로잉, 타입 가드, 명확한 타입 정의 우선 |
7. 참고 자료
as 한 줄이면 오류가 사라진다? 하지만 그게 꼭 정답은 아닙니다. 타입 단언은 신중하게, 꼭 필요한 순간에만 사용해보세요. 🙌
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.