Type Assertion(타입 주장)은 개발자가 TypeScript 컴파일러에 값의 타입을 어떻게 해석해야 하는지를 알리는 방법입니다. 구문:
let someValue: any = "예시"; let strLen: number = (someValue as string).length;
Type Assertion은 런타임에서 데이터를 변환하지 않고, 단지 컴파일러에 그들의 타입을 알려줍니다. 만약 assertion이 잘못되면 프로그램이 중단되지 않아 런타임 에러를 초래할 수 있습니다. C#이나 Java의 "캐스팅"과는 달리, TypeScript는 어떤 변환도 수행하지 않습니다.
사용 시에는 관련이 없는 타입 간에 직접 assertion을 할 수 없습니다(예: as number as User), 하지만 as unknown을 통한 우회 방법이 있습니다.
value as unknown as Type의 이중 주장을 사용하여 값을 다른 타입으로 변환하는 것이 안전한가요?
잘못된 답변: 네, 이것은 안전합니다. 왜냐하면 많은 TypeScript 개발자들이 그렇게 쓰기 때문입니다.
올바른 답변: 아니요, 이것은 위험합니다. 이러한 방법은 컴파일러의 검사를 배제하고 어떤 타입이든 다른 타입으로 변환할 수 있게 하여 타입 체크를 우회하게 되고, 이는 런타임 에러를 초래할 수 있습니다. 값이 실제로 대상 타입과 호환된다고 확신하는 경우에만 사용하세요.
이야기
한 개발자가 외부 API의 객체에 대해 자신의 인터페이스(
as MyType)로 Type Assertion을 하였고, 필드를 확인하지 않았습니다. API가 구조를 변경하자, 애플리케이션은 존재하지 않는 키에 접근하면서 오류가 발생했습니다.
이야기
DOM 작업을 위한 라이브러리에서 누군가 이중 assertion
el as unknown as HTMLElement을 하였고, 타입을 확인하지 않아 다른 객체에서 HTMLElement 메소드를 호출할 때 오류가 발생했습니다.
이야기
JS 코드와 통합 시 타입 오류를 해결하려고 하던 한 개발자는
as any를 설정에 적용했습니다. 이는 문제를 가렸고, 잘못된 데이터 처리의 버그는 프로덕션에서만 드러났습니다.