본문 바로가기

Languages/TypeScript

[TypeScript] 타입 단언 (Type Assertion)

728x90

 

 

   목차 

1. "타입 단언"이란?
2. 타입 단언의 기본 사용법
3. 타입 단언은 언제 쓰는가?

 

 

타입 단언에 대해서 알아보자!

 

 


 

 

 1. "타입 단언"이란? 

 

TypeScript에서 개발자가 특정 값이 원하는 타입임을 컴파일러에게 명시적으로 알리는 방법

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

다른 언어의 타입 캐스팅과 비슷한 개념이며 타입스크립트를 컴파일 할 때 특별히 타입을 체크하지 않고, 데이터의 구조도 신경쓰지 않는다.

 

 


 

 

 2.  타입 단언의 기본 사용법 

 

타입 단언은 기본적으로 as 키워드를 이용해서 정의할 수 있다.

 

// 타입 단언 적용 전 

const name: string = 'Capt';

 

위 코드는 타입 표기 방식을 이용해 name 이라는 변수의 타입은 string 이라고 정의한 코드이다.

이 코드에 타입 단언을 적용하면 아래와 같다.

 

// 타입 단언 적용 후

const name = 'Capt' as string;

 

비주얼 스튜디오 코드에서 name 변수의 정보를 확인해 보면 동일하게 string으로 추론되는 것을 확인할 수 있다.

 

 

 또 다른 예시 

 

let someValue: any = "Hello, TypeScript!";
let stringLength: number = (someValue as string).length;

 

여기서 someValue는 any 타입이므로 TypeScript는 그 값이 무엇인지 정확히 알지 못한다.

그러나 개발자는 이 값이 문자열임을 알고 있기 때문에 someValue as string을 사용하여 컴파일러에게 "이 값은 문자열로 취급해라"라고 명확하게 알려줄 수 있다.

 

 


 

 

 3. 타입 단언을 언제 쓰는가? 

 

타입 단언은 타입스크립트 컴파일러보다 개발자가 더 해당 타입을 잘 알고 있을 때 사용해야 한다.
혹은, 자바스크립트 기반 코드에 점진적으로 타입스크립트를 적용할 때도 자주 사용된다.
예를 들어, 다음과 같은 자바스크립트 코드가 있다고 해보자.

 

// app.js
const capt = {};
capt.name = '캡틴';
capt.age = 100;

 

이 객체에 아래와 같이 타입 표기 방식으로 타입을 정의하려고 하면 에러가 발생한다.

 

interface Hero {
  name: string;
  age: number;
}

const capt: Hero = {}; // X. 오류 발생
capt.name = '캡틴';
capt.age = 100;

 

여기서 capt 변수는 Hero 인터페이스를 따르는 객체로 선언되었지만, 빈 객체 {}로 초기화하려고 하고 있다.
Hero 인터페이스는 name과 age라는 필수 속성이 정의되어 있으므로, {}는 Hero 타입의 객체로 간주될 수 없다.
TypeScript는 객체가 생성될 때 인터페이스에 정의된 모든 필수 속성이 존재하는지 확인하기 때문이다.
따라서 빈 객체로 선언하려고 할 때, "필수 속성 name과 age가 없기 때문에" 오류가 발생한다.

기존에 운영하던 서비스의 코드가 위와 같다면 아래와 같이 코드를 변경하여 타입 오류를 해결할 수도 있다.

 

interface Hero {
  name: string;
  age: number;
}

// 모든 필수 속성을 초기화하기
// 객체를 선언할 때 인터페이스에 정의된 모든 속성을 함께 제공한다.

const capt: Hero = {
  name: '캡틴',
  age: 100
};

 

하지만, 기존 코드의 변경 없이 as 키워드로 타입 문제를 해결할 수 있다.

interface Hero {
  name: string;
  age: number;
}

const capt = {} as Hero; // 오류 없음
capt.name = '캡틴';
capt.age = 100;

 

이렇게 하면 Hero 인터페이스의 규칙을 충족하므로 오류가 발생하지 않게 된다.

하지만 이 경우, 컴파일러는 타입 단언을 통해 빈 객체가 Hero 타입이라고 인식하게 되지만, 실제로 빈 객체가 처음에는 name이나 age 속성을 가지고 있지 않기 때문에 런타임 오류를 발생시킬 수 있다.

따라서 타입 단언은 적절히 사용할 경우 강력하지만, 남용하면 타입 안전성을 해칠 수 있기 때문에 신중하게 사용하는 것이 중요하다.

 

728x90