문제의 역사:
TypeScript는 정적 타입 지정을 구현하므로 때때로 하나의 타입을 다른 타입으로 명시적으로 변환할 필요가 있습니다. 예를 들어, 개발자가 데이터 구조를 컴파일러보다 더 잘 알고 있거나, 타입이 지정된 API와 작업해야 하는 경우, 원래 타입이 예상되는 것과 일치하지 않을 수 있습니다. 이를 위해 type casting 또는 타입 단언 메커니즘이 사용됩니다.
문제:
TypeScript에서 타입 변환(type casting)은 실행 시간에 값의 변환을 수행하지 않습니다. 단지 컴파일러에게 "나를 믿어라"라고 알리는 것입니다. 이는 지정된 캐스트가 실제 데이터 내용과 일치하지 않을 경우 오류로 이어질 수 있습니다. 오류는 런타임에만 발생하며 컴파일러가 발견하지 못합니다.
해결책:
TypeScript에는 두 가지 타입 변환 구문이 포함되어 있습니다: angle-bracket(구식, JSX에는 권장되지 않음)과 as 구문(추천됨).
코드 예:
// 꺽쇠 괄호를 통한 구문 ( .tsx에서는 사용하지 않음) let someValue: any = "Hello World"; let strLength: number = (<string>someValue).length; // as를 통해 구문 let strLength2: number = (someValue as string).length; // 객체 타입 변환 (안전하지 않음!) interface Cat { meow(): void; } interface Dog { bark(): void; } let dog: Dog = { bark() {} }; let cat = dog as unknown as Cat; // 가능하지만 타입 검증을 우회합니다!
주요 특징:
type assertion이 C#이나 Java처럼 런타임에 값의 자동 변환을 수행합니까?
아니요, type assertion은 그저 컴파일러에게 이 변수가 해당 타입이라고 알리는 것입니다. 어떤 값의 변환도 발생하지 않으며, 모든 책임은 개발자에게 있습니다.
구조가 공유되지 않는 타입 A를 타입 B로 변환할 수 있습니까?
TypeScript는 이를 허용합니다(예: double cast를 통해 any 또는 unknown 사용), 그러나 이는 타입 안전성을 저해하고 실행 단계에서 오류를 초래할 수 있습니다.
const a = 5 as unknown as string; // 안전하지 않습니다!
any를 복잡한 타입으로 변환하는 것이 안전합니까?
아니요, any는 타입 검사를 해제합니다. any를 다른 타입으로 변환할 수 있지만 TypeScript는 불일치를 감지할 수 없으며 모든 오류는 실행 시에만 나타납니다.
개발자가 구조 검증 없이 서버에서 객체를 받고, 이를 예상되는 타입으로 간단히 as SomeType으로 변환하여 비즈니스 로직에서 사용합니다. API 변경이나 서버의 버그로 인해 애플리케이션이 런타임에 중단되며, 컴파일 단계에서 오류가 발생하지 않습니다.
장점:
단점:
개발자가 수신된 객체의 구조를 사전 검증하고, 사용자 정의 type guard 함수를 사용한 후에만 type assertion을 수행합니다.
장점:
단점: