ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 함수는 userAdminUser로 변환하여 반환하려고 합니다.

     

    그러나 return user;에서 에러가 발생합니다.

     

    이는 User 타입을 AdminUser 타입으로 직접 변환할 수 없기 때문인데요. 이 문제를 해결하는 방법이 바로 어설션(Assertion)입니다.

    return user as AdminUser;

     

    as AdminUser를 추가함으로써 userAdminUser 타입으로 변환할 수 있습니다.

     

    이처럼 어설션(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 공식 문서나 다양한 온라인 자료를 참고해보시기 바랍니다.

     


     

Designed by Tistory.