개발자가 컴파일러에게 "이 변수는 이 타입이다"라고 명시적으로 알려주는 기능을 말합니다. 보통 타입스크립트는 타입 추론을 통해 타입을 결정합니다. 타입 추론을 활용하는 편이 안정성이 좋지만 타입 단언을 사용할 수 밖에 없는 상황에서는 타입 단언을 사용합니다.
타입 단언을 사용하면 유연성을 높일 수 있고 좀 더 쉽게 타입스크립트를 사용할 수 있습니다. 또는 외부라이브러리와 같이 내가 타입을 직접 변경할 수 없는 경우 사용하면 에러를 해결해줄수 있다는 장점이 있습니다.
그렇지만 타입 단언을 활용하게 되면 컴파일러가 타입검사를 하지 않기 때문에 런타임 에러가 발생할 수 있습니다. 이로 인하여 타입 안정성이 저하될 수 있습니다.
따라서 타입 단언은 반드시 필요한 경우에만 사용해야 하며, 타입 단언 대신에 타입 가드나 제네릭을 활용하여 타입 안정성을 유지하면서 코드를 작성하는 것이 권장되는 방법입니다.
let variable1: any = "hello";
let length1: number = (<string>variable1).length;
let variable2: any = "world";
let length2: number = (variable2 as string).length;
반드시 값이 존재한다는것을 의마하는 연산자입니다. 해당 연산자를 활용하면 컴파일시점에는 에러가 발생하지 않을 수 있지만, 실제 런타임 시점에는 에러가 발생할 수 있는 가능성이 있습니다.
function getStringLength(str: string | null): number {
return str.length; // 에러 발생! str이 null일 수 있음
}
function getStringLengthWithAssertion(str: string | null): number {
return str!.length; // '!' 연산자를 사용하여 null 아님을 보장
}
// 타입단언은 원시값에 사용 가능
const value: any = "Hello, TypeScript!";
const stringValue: string = value as string;
// 타입단언은 함수/변수 호출 결과에도 사용 가능
function calculateLength(input: string): number {
return input.length;
}
const result: number = calculateLength("Hello") as number;
// 중첩된 타입단언도 가능
const nestedValue: any = 123;
const nestedString: string = ((nestedValue as number).toString()) as string;
// 호환되지 않은 데이터 타입단언은 불가
const incompatibleValue: any = "Hello";
// const incompatibleNumber: number = incompatibleValue as number; // 오류 발생
// const as: string = "Hello"; // 'as'는 예약어라 사용할 수 없음