ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (TypeScript) - TypeScript 타입 단언
    개발/TypeScript 2025. 8. 20. 16:13
    반응형

    ■ 타입 단언

    type Person = {
        name: string;
        age: number;
    };
    
    let person = {} as Person;
    person.name = '송송송';
    person.age = 27;

     

    Person 타입이 정해져 있는데 person 처럼 빈 객체로 우선적으로 할당하고 싶다고 가정해보자.

    원래대로라면 Person 객체 프로퍼티가 있기 때문에 빈 객체 선언은 불가능하다. 

    하지만 프로퍼티의 값을 빈 객체로 선언하고 나중에 정하고 싶을 때 타입 선언이 가능한 것을 타입 단언이라고 한다. 

     

    type Dog = {
        name: string;
        color: string;
    };
    
    let dog: Dog = {
        name: '돌돌이',
        color: 'brown',
        bread: '진도', //추가 프로퍼티 오류!
    };

     

    다음과 같이 기존 타입에 없던 새로운 프로퍼티를 추가하면 추가 프로퍼티 오류가 발생한다.

     

    let dog = {
        name: '돌돌이',
        color: 'brown',
        bread: '진도',
    } as Dog;

     

    그럴 때는 위에 as 로 타입 단언을 해준 것처럼 타입 단언을 해주면 오류가 해결된다.

     

    ■ 타입 단언의 규칙

    /**
     * 타입 단언의 규칙
     * 값 as 단언 <- 단언식
     * A as B
     * A 가 B 의 슈퍼타입이거나
     * A 가 B 의 서브타입이어야 함
     */
    let num1 = 10 as never; //가능 -> A가 B의 슈퍼타입
    let num2 = 10 as unknown; //가능 -> A가 B의 서브타입
    
    let num3 = 10 as string; //불가능

     

    타입 단언은 마음대로 사용해서는 안된다. (타입 오류를 넘기는 타입스크립틑의 이점을 잃을 수 있다.)

    다음과 같이 단언하기 위해서는 A 가 B 의 슈퍼타입이거나, A 가 B 의 서브타입이어야 한다.

     

    num1 과 num2 는 이를 만족했으나,

    num3 은 number 와 string 으로 아예 겹치지 않는다.

    따라서 타입 단언 규칙과 맞지 않으므로 오류에 해당한다.

     

    let num3 = 10 as unknown as string;

     

    다음과 같이 다중 단언을 하면 오류는 해결된다.

    먼저 number 를 unknown 타입으로 할당하면 10 은 unknown 타입이 된다.

    여기서 다시 as string 을 통해 10(unknown) 이 슈퍼타입임으로 string 타입이 된다.

     

    이렇게 단언 규칙을 무조건 될 수 있게 만들수는 있으나

    이 방법은 거의 쓰면 안된다.

    왜냐하면 이는 타입 스크립트를 써서 타입 오류를 검증하는 장점을 없애버리기 때문이다.

     

    ■ const 단언

    /**
     * const 단언
     */
    let num4 = 10 as const;

     

    const 단언을 하게 되면 마치 const 로 할당한 것처럼 number 리터럴 타입이 된다.

     

     

    객체에서 타입 단언을 사용하게 되면 readonly 된 객체로 추론된다.

    따라서 프로퍼티의 값을 수정할 수 없는 값이 된다.

     

    즉, as const 를 붙이면 모든 프로퍼티에 일일이 readonly 를 붙이지 않고

    읽기만 가능한 객체를 생성하는 것이 가능하다.

     

    ■ non null 단언

    : 어떤 값이 null 이거나 undefined 가 아니라고 컴파일러에게 알려주는 단언이다.

     

    const len: number = post.author?.length; //불가능

     

    ? (옵셔널 체이닝) : null 이거나 undefined 인 경우 오류가 남으로 물음표를 붙여줘서 실행 시 만약 프로퍼티가 없다면 post.author?.length 자체가 undefined 로 만들어준다.

     

    여기 값은 오류가 난다.

    왜냐면 len 은 number 타입인데 post.author?.length 가 undefined 가 되면

    number 안에 undefined 값이 들어갈 수 없기 때문이다.

     

    const len: number = post.author!.length;

     

    그럴 경우 ? 를 ! 로 바꿔주면 된다.

    ! 는 해당 값이 null 이거나 nudefined 가 아니라고 타입스크립트가 믿게 만드는 것이다.

     

    타입 단언은 실제 그 값을 그 타입으로 변환하는 것이 아니라 타입스크립트 컴파일러를 잠깐 속이는 것이다.

    따라서 앞선 것과 같이 단언은 확실할 때만 사용해야 한다. 

    반응형
Designed by Tistory.