
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 활용하여 깔끔한 인터페이스 만들기 (1) | 2024.09.20 |
| 구글링으로 찾은 TypeScript 초보자를 위한 안전한 스토리지 래퍼 활용법 (0) | 2024.09.20 |
| Next.js 14에서 JWT를 안전하게 관리하는 방법: Express 백엔드와의 통합 (1) | 2024.09.19 |
| Next.js에서 Vite로 전환: 왜 많은 개발자들이 Next.js를 떠나고 있을까? (1) | 2024.09.19 |