Skip to content

Latest commit

 

History

History
138 lines (91 loc) · 3.23 KB

File metadata and controls

138 lines (91 loc) · 3.23 KB

6. 타입 단언

타입 단언이란

다음과 같은 코드가 있다고 가정

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

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

→ 변수 person은 Person 타입으로 정의 되어있지만 초기화 할 때에는 빈 객체를 넣어두고 싶다고 가정.

→ TS에서는 이런 경우를 허용하지 않음…


이럴때는 다음과 같이 빈 객체를 Person 타입이라고 TS에게 단언해주면 됨

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

→ bread라는 초과 프로퍼티가 존재하지만 이 값을 Dog 타입으로 단언해서 초과 프로퍼티 검사를 피함


타입 단언의 조건

갑 as 타입 형식의 단언식을 A as B로 표현했을 때 아래의 두가지 조건중 한가지를 반드시 만족해야 함

  • A가 B의 슈퍼타입이다
  • A가 B의 서브타입이다.

ex.

let num1 = 10 as never;   // ✅
let num2 = 10 as unknown; // ✅

let num3 = 10 as string;  // ❌

다중 다언

타입 단언은 다중으로 가능함. 다중 단언을 이용하면 앞서 살펴본 예제 중 불가능했던 단언을 다음과 같이 가능하도록 만들 수 있음

let num3 = 10 as unknown as string;

이를 순서대로 살펴보면

  1. number 타입의 값을 unknown 타입으로 단언함
  2. unknown 타입의 값을 string 타입으로 단언함

이렇든 중간 값을 unknown 타입으로 단언하면 unknown 타입은 모든 타입의 슈퍼타입이므로 모든 타입으로 또 다시 단언하는게 가능함


하지만 이렇게 단언하는 것은 좋지 않음… 타입 단언은 실제로 그 값을 해당 타입의 값으로 바꾸는 것이 아니라 단순 눈속임에 불과함. 따라서 이렇게 값을 슈퍼-서브 관계를 갖지 않는 타입으로 단언하면 오류가 발생할 확률이 매우 높아짐…


따라서 어쩔 수 없이 필요한 상황에서만 이용하기를 권장함


const 단언

타입 단언때에만 사용할 수 있는 const 타입이 존재함. 특정 값을 const 타입으로 단언하면 마치 변수를 const로 선언한 것과 비슷하게 타입이 변경됨

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

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

Non Null 단언

Non Null 단언은 지금까지 살펴본 값 as 타입 형태를 따르지 않는 단언임. 값 뒤에 느낌표 !를 붙여주면 이 값이 undefined이거나 null이 아닐것으로 단언할 수 있음

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

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

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