타입 단언 Type Assertion

Gom·2021년 7월 17일
0

TypeScript

목록 보기
4/5

타입 단언 (type assertion)

  • 의미 : 타입 단언을 통해 컴파일러에게 특정 타입 정보의 사용을 강제할 수 있다.
  • 필요한 경우 : 타입스크립트 컴파일러는 type annotation, type guards, type inference 등을 이용해 값의 타입을 판단하지만 컴파일러가 가진 정보를 무시하고 원하는 임의의 타입을 할당하고자 할 때 사용한다.

<span style={color: "red"}>주의할 점이 더 많은..

타입 단언 유의사항

  • 타입 에러를 없애줄 뿐 런타임 에러를 막아주지는 않는다. 오히려 컴파일 타임에 잡을 수 있는 에러를 무시하여 예방 가능했던 런타임 에러를 발생시킬 수 있다.

  • 타입스크립트를 사용하는 근본적인 이유는 런타임에 발생할 에러를 컴파일 과정에서 걸러내기 위함인데 타입 단언을 무분별하게 사용하는 것은 의도에 반하는 행동이다.

  • 타입 검사를 생략하더라도 문제가 생길 일이 없다고 확신할 수 있을 때만 사용해야 한다.

타입 단언 문법

확정적 할당 단언(definitive assignment assertion)

변수나 프로퍼티명 뒤에 느낌표(!)를 붙여서 컴파일러의 검사를 건너뛰게 할 수 있다.

value as Type

컴파일러가 가진 정보를 모두 무시하고 valueType 타입의 값이라 생각하고 실행하도록 강제하는 방식이다.

interface Dog {
  legs: 4;
  bark(): void;
}

interface Insect {
  legs: number;
  creepy: boolean;
}

interface Fish {
  swim(): void;
}

type Animal = Dog | Insect | Fish;

function doSomethingWithAnimal(animal: Animal) {
  (animal as Fish).swim();
  // animal 변수의 타입을 Fish로 단언한다.
  // 원래대로라면 Dog와 Insect를 고려하여 타입 에러가 발생했겠지만 
  // 타입 단언으로 인해 타입 에러없이 컴파일된다. 
  // 런타임에 `Dog` 혹은 `Insect` 값을 받으면 에러가 발생한다.
}

any

any 타입을 이용하면 특정 값에 대한 타입 검사를 무효화할 수 있다.
어쩔 수 없는 경우를 제외하고 사용을 자제한다.

아래 코드는 타입 단언을 이용해 타입 에러를 피해갔지만 런타임 에러가 발생하게 된다.

(3 as any).substr(0, 3);

다중 단언

타입 단언은 여러번 겹쳐 사용할 수 있다.
호환되지 않는 것이 명백한 타입으로의 단언을 가능하게 하는 문법이다.

profile
안 되는 이유보다 가능한 방법을 찾을래요

1개의 댓글

comment-user-thumbnail
2021년 7월 21일

잘 읽고갑니다!!

답글 달기