타입 단언
타입 단언(Type Assertion) 은 개발자가 TypeScript 컴파일러보다 해당 값의 타입을 더 잘 알고 있을 때 사용합니다. 컴파일러의 타입 추론을 무시하고 “이 값은 무조건 이 타입이니 그대로 사용해” 라고 지시하는 것과 같습니다.
- 주의사항:
as는 런타임 시점에 타입을 변환하거나 검사하지 않습니다. 만약 개발자가 잘못된 타입으로 단언하면, 컴파일 시점에는 오류가 없지만 런타임에 예기치 않은 오류가 발생할 수 있습니다. 따라서 꼭 필요한 경우에만 신중하게 사용해야 합니다.
// 예시: DOM 요소 접근
// getElementById는 HTMLElement | null을 반환하지만,
// 개발자는 'my-input'이 HTMLInputElement임을 확신함
const myInput = document.getElementById('my-input') as HTMLInputElement;
// 이제 .value 속성에 바로 접근 가능
console.log(myInput.value);타입 가드
타입 가드(Type Guard) 는 변수의 타입을 좁히거나 확인하여, 이후 코드에서 안전하게 특정 타입으로 다룰 수 있게 하는 기법입니다.
- TypeScript에서는 컴파일 타임에 타입 추론을 돕습니다.
- JavaScript에서는 런타임에 타입을 체크하고 분기 처리를 가능하게 합니다
// typeof : 원시 타입(`string`, `number`, `undefined` ...) 확인
function printValue(value: string | number) {
if (typeof value === "string") {
console.log("문자열 길이:", value.length);
} else {
console.log("숫자 값:", value.toFixed(2));
}
}
// instanceof : 객체가 특정 클래스의 인스턴스인지 확인
class Cat { meow() { console.log("야옹"); } }
class Dog { bark() { console.log("멍"); } }
function speak(pet: Cat | Dog) {
if (pet instanceof Dog) {
pet.bark();
} else {
pet.meow();
}
}
// in: 객체가 특정 속성을 가지고 있는지 확인하여 타입 좁히기
interface Cat { meow(): void; }
interface Dog { bark(): void; }
function isDog(animal: Cat | Dog) {
if ("bark" in animal) {
animal.bark(); // Dog 타입
} else {
animal.meow(); // Cat 타입
}
}