타입 단언

정민교·2023년 10월 13일
0

typescript

목록 보기
6/17

📒타입 단언

type Person = {
  name: string;
  age: number;
};

let person: Person = {};
person.name = "";
person.age = 23;

위와 같은 코드는 타입스크립트에서 오류를 발생시킵니다.

할당하려고 하는 빈 객체가 Person 타입이 아니기 때문입니다.

하지만 초기화 할 때에는 빈 객체로 넣어두고 싶을 수도 있습니다.

이를 위해서 타입 단언을 사용할 수 있습니다.

type Person = {
  name: string;
  age: number;
};

let person = {} as Person;
person.name = "";
person.age = 23; 

값 as 타입의 형태로 특정 값을 원하는 타입으로 단언하면 됩니다.

이는 초과 프로퍼티 검사를 피할 때에도 자주 사용합니다.

type Dog = {
  name: string;
  color: string;
};

let dog: Dog = {
  name: "돌돌이",
  color: "brown",
  breed: "진도",
} as Dog

위와 같은 코드에서 Dog 타입으로 변수를 선언했지만 초기화하는 객체가 정확하게 Dog 타입이 아닌 객체 리터럴을 할당하면 초과 프로퍼티 검사가 발동합니다.

이를 피하기 위해서 다른 변수에 값을 보관해두었다가 할당하는 방법을 사용할 수도 있지만 간단하게 타입 단언을 통해 해결할 수도 있습니다.

✔️타입 단언의 조건

타입 단언을 사용할때는 조건이 있습니다.

A as B로 표현했을 때 두 가지 조건 중 한가지를 반드시 만족해야 합니다.

  • A가 B의 슈퍼 타입(상위 타입)이다.
  • A가 B의 서브 타입(하위 타입)이다.
let num1 = 10 as never;   // ✅
let num2 = 10 as unknown; // ✅

let num3 = 10 as string;  // ❌

never는 타입 계층도에서 가장 하위의 타입입니다.

따라서 첫 번째 문은 정상적으로 타입 단언이 가능합니다.

unknown은 타입 계층도에서 가장 상위의 타입입니다.

따라서 두 번째 문도 정상적으로 타입 단언이 가능합니다.

number(10 리터럴)은 string 타입의 슈퍼 타입도, 서브 타입도 아닙니다.

따라서 세 번째 문은 정상적으로 타입 단언이 불가능합니다.

✔️다중 단언

let num3 = 10 as unknown as string;

위와 같이 타입 단언을 다중으로 사용할 수 있습니다.

10unknown 타입으로 단언한 후 string 타입으로 단언했습니다.

unknown은 타입 계층도에서 가장 상위 타입이기 때문에 10을 unknown으로 타입 단언이 가능하고

stringunknwon의 서브 타입이기 때문에 마찬가지로 타입 단언이 가능합니다.

하지만 이런 다중 타입 단언은 별로 좋지 못한 방식이기 때문에 어쩔 수 없이 다른 방법이 없는 경우에만 사용하는 것이 좋습니다.

✔️const 단언

let num4 = 10 as const;
// 10 Number Literal 타입으로 단언됨

let cat = {
  name: "야옹이",
  color: "yellow",
} as const;
// 모든 프로퍼티가 readonly를 갖도록 단언됨

const로도 타입 단언이 가능합니다.

이는 그냥 const로 변수를 선언한 것과 동일한 결과를 냅니다.

✔️Non Null 단언

값 뒤에 ! 느낌표를 붙여주어 값이 undefined 혹은 null이 아님을 단언합니다.

type Post = {
  title: string;
  author?: string;
};

let post: Post = {
  title: "게시글1",
};

const len: number = post.author!.length;
profile
백엔드 개발자

0개의 댓글