[Typescript] 타입 단언 as

Narcoker·2025년 5월 12일

Typescript

목록 보기
10/15

타입 단언

개발자가 해당 타입에 대해 확신이 있을 때 사용하는 타입 지정 방식

컴파일 시 해당 값을 지정한 타입으로 간주,
실제 구조가 맞는지까지는 검사하지 않음

컴파일 에러는 발생하지 않지만,
런타임에서 예상치 못한 오류가 발생할 수 있음

사용 예제 - 1, 빈 객체로 초기화 후 수정

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

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

위 코드는 에러를 발생시킨다.
Person 타입 정의에 보면 반드시 name, age 프로퍼티를 포함시켜야하기 때문이다.

개발자가 원하는 것은,
초기에 person 객체를 빈 객체로 할당하고 이후에 프로퍼티를 추가하고자 한다.

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

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

이렇게 값 as 타입 으로 특정 값을 원하는 타입으로 단언해서 해결할 수 있다.

사용 예제 - 2, 초과 프로퍼티 피하기

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

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

타입 단언은 다음과 같이 초과 프로퍼티 검사를 피할때에도 요긴하게 사용할 수 있다.
breed 라는 초과 프로퍼티가 존재하지만,
이 값을 Dog 타입으로 단언하여 초과 프로퍼티 검사를 피했다.

타입 단언이 적용되는 조건

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

let num3 = 10 as string;  // ❌ - 형제 관계

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

  • A가 B의 슈퍼타입
  • A가 B의 서브타입

= 두 타입은 계층 관계

다중 단언 - 권장하지 않음

let num3 = 10 as unknown as string;

타입 단언은 다중으로도 가능하다.
다중 단언을 이용하면 단언을 다음과 같이 가능하도록 만들 수도 있다.

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

단순 눈속임이기 때문에 오류가 발생할 확률이 매우 높다.

const 단언

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

let cat = {
  name: "야옹이",
  color: "yellow",
} as const;

특정 값을 const 타입으로 단언하면,
모든 프로퍼티가 readonly를 갖게 된다.

즉, 프로퍼티 값을 수정할 수 없게 된다.

Non Null 단언 - !.

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

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


// if(post.author) { 
//  console.log(post.author);
// }

console.log(post!.author);

값 as 타입 형태를 따르지 않는 단언.
값 뒤에 느낌표(!) 를 붙여주면,
이 값이 undefined이거나 null이 아닐 것으로 단언할 수 있다.

Non Null 단언을 사용하는 것이 과연 좋은 방식일까

라인 수가 줄어들 순 있겠지만 에러 핸들링을 하지 못할 듯 하다.
또한 라인 수가 줄어들었기 때문에 가독성이 좋아졌다고 생각할 수도 있는데
if 문이 있는게 더 읽기 편한 경우도 있다.

제 생각입니다.

참조

인프런 - 한 입 크기로 잘라먹는 타입스크립트

타입스크립트 핸드북

profile
열정, 끈기, 집념의 Frontend Developer

2개의 댓글

comment-user-thumbnail
2025년 5월 12일

const 로 객체 선언 vs const로 타입 단언 추가하기

1개의 답글