타입 단언 (Type assertion)

타입스크립트에서는 타입 단언을 통해 추론한 타입 혹은 anyunknown등으로 정의된 타입을 직접 변경할 수 있다.

타입 단언은 현재 선언 되어있는 타입보다 더 구체적인 타입의 정의가 필요하거나 자바스크립트로 작성된 코드를 원하는 타입으로 변경할 때 사용한다. 타입 단언은 두 가지 방식으로 가능하다.

angle-bracket 문법

다음과 같이 <type> 문법을 통해 타입 단언이 가능하다.

let text: any = "lorem ipsum";

let len: number = (<string>text).length;
1
2
3

다만 JSX에서는 자체적으로 angle-bracket 문법을 사용하기 때문에, 타입 단언을 위해 angle-bracket 문법을 사용하면 코드의 구분이 모호한 문제가 발생할 수 있다. 즉 타입스크립트는 .tsx 파일에서 angle-bracket 문법을 지원하지 않는다.

let len = <string>text.length;
1

as 문법

.tsx 파일에서 타입 단언이 필요한 경우에는 as 문법을 사용해야 한다. as 문법은 .ts.tsx 파일에서 모두 사용 가능하며, angle-bracket 문법과 동일하게 동작한다.

let text: any = "lorem ipsum";

let len: number = (text as string).length;
1
2
3

타입 단언 활용하기

예를 들어 다음과 같은 형태의 빈 객체가 존재한다고 가정해보자. 타입스크립트는 user 변수를 빈 객체 타입이라고 추론하기 때문에, 빈 객체에 프로퍼티를 추가하려고 하면 오류가 발생한다.

let user = {};

user.name = "홍길동";
// Property 'name' does not exist on type '{}'
user.age = 20;
// Property 'age' does not exist on type '{}'
1
2
3
4
5
6

빈 객체로 선언되어 있는 user에 프로퍼티를 추가하기 위해서는 user에 대해 타입 단언이 필요하다. 객체 타입 단언은 기존에 존재하는 타입으로는 불가능하므로 원하는 구조를 타입 별칭 혹은 인터페이스로 정의해야 한다.

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

let user = {} as User;

user.name = "홍길동";
user.age = 20;
1
2
3
4
5
6
7
8
9

트랜스파일링

타입 단언은 데이터를 재구성하거나 특별한 검사를 하지는 않으며, 트랜스파일링 작업을 할 때 정적 유형 검사를 위한 용도로 사용된다.

let text: any = "lorem ipsum";

let len1: number = (<string>text).length;
let len2: number = text.length;
1
2
3
4

실제로 타입 단언을 사용한 타입스크립트 코드를 자바스크립트 코드로 트랜스파일링할 경우, 다음과 같이 달라지는 점은 없다.

var text = "lorem ipsum";
var len1 = text.length;
var len2 = text.length;
1
2
3
Last Updated:
Contributors: dailyuno