-
TypeScript에서 더블 어설션(Double Assertion) 이해하기: 안전하게 타입 변환Javascript 2024. 9. 20. 18:32
TypeScript에서 더블 어설션(Double Assertion) 이해하기: 안전하게 타입 변환
TypeScript에는 "더블 어설션(Double Assertion)"이라는 기능이 있습니다.
가능하면 사용을 피하는 것이 좋지만, 하나의 기술로서 알아두면 유용할 것 같습니다.
어설션(Assertion)이란?
어설션(Assertion) 자체가 타입을 강제로 변환하는 기능인데요, 아래의 예제를 통해 이해해볼까요?
type User = { id: string; name: string; isAdmin?: boolean; } type AdminUser = User & { isAdmin: true; } function userToAdminUser(user: User): AdminUser { user.isAdmin = true; // Type 'User' is not assignable to type 'AdminUser'. return user; }
userToAdminUser
함수는user
를AdminUser
로 변환하여 반환하려고 합니다.그러나
return user;
에서 에러가 발생합니다.이는
User
타입을AdminUser
타입으로 직접 변환할 수 없기 때문인데요. 이 문제를 해결하는 방법이 바로 어설션(Assertion)입니다.return user as AdminUser;
as AdminUser
를 추가함으로써user
를AdminUser
타입으로 변환할 수 있습니다.이처럼 어설션(Assertion)을 사용하면 이름 그대로 타입을 강제로 변환할 수 있습니다.
더블 어설션(Double Assertion)이란?
위와 같은 방식은 간단한 경우에는 문제를 해결할 수 있었는데요, 더 복잡한 경우는 어떻게 될까요?
다음 예제를 보겠습니다.
type User = { id: string; name: string; isAdmin?: boolean; } type AdminUser = { id: string; adminName: string; isAdmin: true; } function numberToString(foo: User): AdminUser { foo.isAdmin = true; // Conversion of type 'User' to type 'AdminUser' may be a mistake because neither type sufficiently overlaps with the other. return foo as AdminUser; }
위 예제에서는
AdminUser
타입이User
타입과 충분히 겹치지 않기 때문에return foo as AdminUser;
에서 에러가 발생합니다.이럴 때 사용하는 것이 더블 어설션(Double Assertion) 입니다.
return foo as unknown as AdminUser;
이렇게 먼저
unknown
타입으로 변환한 후, 다시 원하는 타입으로 변환하는 방식입니다.모든 타입은
unknown
의 서브타입이기 때문에 어떤 타입으로도 변환이 가능하며, 두 번 어설션을 하기 때문에 더블 어설션이라고 부릅니다.더블 어설션(Double Assertion)을 피해야 하는 이유
더블 어설션(Double Assertion)을 사용하는 것은 타입 안전성을 크게 저해할 수 있는 방법인데요, 그 이유는 다음과 같습니다.
예를 들어, 위의 코드에서
foo
는 실제로AdminUser
타입이 아니는데도 불구하고as unknown as AdminUser
를 사용하여 에러를 무시할 수 있습니다.이는 런타임에서 의도치 않은 동작을 초래할 수 있습니다.
function numberToString(foo: User): AdminUser { foo.isAdmin = true; // adminName을 설정하지 않았는데도 에러가 발생하지 않습니다 return foo as unknown as AdminUser; }
이처럼, 더블 어설션(Double Assertion)을 사용하면 타입 시스템의 보호를 벗어나게 되어 예기치 않은 버그가 발생할 가능성이 높아집니다.
결론
TypeScript에서 어설션은 타입을 강제로 변환할 수 있는 유용한 기능이지만, 사용에 신중을 기해야 합니다.
특히, 더블 어설션(Double Assertion)은 타입 안전성을 크게 해칠 수 있으므로 가능한 한 피하는 것이 좋습니다.
대신, 타입 정의를 명확히 하고 타입 간의 관계를 잘 설계하는 것이 안정적인 코드를 작성하는 데 도움이 됩니다.
참고
TypeScript의 어설션과 더블 어설션에 대해 더 깊이 알고 싶다면, TypeScript 공식 문서나 다양한 온라인 자료를 참고해보시기 바랍니다.
'Javascript' 카테고리의 다른 글
React에서 콜백을 활용한 컴포넌트 분리 이해하기 (0) 2024.09.21 TypeScript 초보자를 위한 Mapped Types 활용하여 깔끔한 인터페이스 만들기 (0) 2024.09.20 구글링으로 찾은 TypeScript 초보자를 위한 안전한 스토리지 래퍼 활용법 (0) 2024.09.20 Next.js 14에서 JWT를 안전하게 관리하는 방법: Express 백엔드와의 통합 (1) 2024.09.19 Next.js에서 Vite로 전환: 왜 많은 개발자들이 Next.js를 떠나고 있을까? (0) 2024.09.19