본문 바로가기
Language/TypeScript

[TypeScript] 타입추론(Type Inference)과 타입표명(Type Assertion)

by 썸머워즈 2022. 6. 2.
반응형

타입 추론과 타입 표명에 대해 알아보자.

(영어의 뜻을 해석하다보니 타입 표명, 타입 단언 등 뭐 어쨌든 다 동일한 뜻이다.)


Type Inference

타입 추론이란 TypeScript에서 명시적인 타입 표기가 없을 때 타입 정보를 제공하기 위해 사용되는 것이다.

그냥 쉽게 말하면 자동으로 타입을 결정해주는 것이라고 보면 된다.

let x = 3; // let x: number
let y = "4"; // let y: string

이런 식으로 javascript처럼 사용하면 typescript는 자동적으로 타입을 추론하여 알맞은 타입을 결정한다.

 

그리고 여러 타입을 동시에 사용할 경우 최적 공통 타입을 알아서 계산해준다.

let x = [0, 1, null]; // let x: (number | null)[]

또 정말 신기한것은 문맥을 체크하여 타입을 결정짓는다는 것이다.

이건 아마 개인적인 생각으로 any타입에 의해 그런 거 같은데, 사실상 신기하지만 그렇게 좋다고 볼 수는 없을 것 같다.

 

이런 식으로 타입 스크립트는 자동으로 타입을 결정지어 주지만 아무래도 타입 스크립트를 선택해서 사용하는 입장에서는 제대로 명시해서 사용해 주는 게 맞다고 생각된다.

Type Assertion

타입 표명 또는 타입 단언이라 불리는 Type Assertion은 타입을 강제적으로 지정해 주는 것을 말한다.

여기서 타입 캐스팅과 다르다는 점을 인식하고 있어야 한다.

function getData(): any {
  return "3";
}

const result = getData();
(result as string).length;

일단 이런 식으로 any라는 타입을 string 타입으로 변환해 사용하는 것을 의미한다.

 

그럼 이어서 바로 다음 예제를 살펴보자.

let x = "1";

// error: 'string' 형식을 'number' 형식으로 변환한 작업은 실수일 수 있습니다. 
// 두 형식이 서로 충분히 겹치지 않기 때문입니다. 
// 의도적으로 변환한 경우에는 먼저 'unknown'으로 식을 변환합니다.
let y: number = x as number;

let z: number = (<any>x) as number;

위 예제를 보면 y 변수에서 에러가 발생했는데,

Type Assertion를 사용하는 규칙은 "보다 구체적인 또는 덜 구체적인" 버전의 타입으로 변환하는 행위만 허용된다.

 

쉽게 말하자면 결국 저런 식의 y변수를 해결하려면 any 나 unknown으로 먼저 변환한 다음에 다시 한번 변환을 시켜줘야 한다는 의미이다. 마치 z 변수처럼 말이다.

 

결론은 그냥 타입 추론이든 타입 표명이든 웬만하면 사용하지 말도록 하자.


참고: https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions

 

Documentation - Everyday Types

The language primitives.

www.typescriptlang.org

 

참고: https://www.typescriptlang.org/docs/handbook/type-inference.html

 

Documentation - Type Inference

How code flow analysis works in TypeScript

www.typescriptlang.org

반응형


댓글

TOP