TypeScript

[TypeScript] 타입 추론 (Type Inference)

2025년 11월 27일
1
TypeScriptStudyTypeInferenceBasics

📑 목차

타입스크립트를 사용하다 보면 모든 변수에 일일이 타입을 정의하지 않아도 코드가 잘 동작하는 것을 볼 수 있다. 이는 타입스크립트가 변수의 타입을 자동으로 파악하는 "타입 추론(Type Inference)" 기능을 제공하기 때문이다.

이번 포스팅에서는 타입스크립트가 언제, 어떻게 타입을 추론하는지, 그리고 주의해야 할 점은 무엇인지 정리해 본다.

1. 타입 추론이 가능한 상황들

일반적으로 변수를 선언하거나 초기화할 때, 타입스크립트는 할당된 값을 기준으로 타입을 추론한다.

1-1. 변수 선언 및 초기화

변수에 초기값을 할당하면 해당 값을 기준으로 타입이 추론된다.

let a = 10; 
// number 타입으로 추론

let b = "hello"; 
// string 타입으로 추론

let c = {
  id: 1,
  name: "조태민",
  profile: {
    nickname: "탬니",
  },
  urls: ["https://taemni.dev"],
}; 
// id, name, profile, urls 프로퍼티가 있는 객체 타입으로 추론 [cite: 207]

1-2. 구조 분해 할당

객체나 배열을 구조 분해 할당할 때도 타입 추론이 정상적으로 동작한다.

let { id, name, profile } = c;
let [one, two, three] = [1, "hello", true];

1-3. 함수의 반환값과 기본 매개변수

함수의 반환값은 return 문을 기준으로, 매개변수는 설정된 default value를 기준으로 추론된다.

// 반환값이 string으로 추론됨
function func() {
  return "hello";
}

// message는 기본값 덕분에 string으로 추론됨
function func2(message = "hello") {
  return "hello";
}

주의: 기본값이 없는 일반 매개변수는 자동으로 추론되지 않는다. 이 경우 암시적으로 any 타입이 되는데, strict 모드에서는 에러가 발생하므로 타입을 명시해줘야 한다 .


2. 주의해야 할 상황들 (Gotchas)

타입 추론이 항상 단순하게 동작하는 것은 아니다. 상황에 따라 타입이 변하거나(진화), 예상보다 좁게 혹은 넓게 추론되기도 한다.

2-1. 암시적 any와 any의 진화 (Evolution of Any)

변수를 선언할 때 초기값을 생략하면, 해당 변수는 암시적으로 any 타입으로 추론된다.

재미있는 점은, 이후에 어떤 값을 할당하느냐에 따라 타입이 계속 변한다는 것이다. 이를 'any의 진화' 라고 부른다.

let d; // 암시적 any

d = 10; 
// 이 라인부터 d는 number 타입
d.toFixed(); 

d = "hello"; 
// 이 라인부터 d는 string 타입
d.toUpperCase();
// d.toFixed(); // ❌ 오류 발생 (number 메서드 사용 불가) [cite: 241]

2-2. const 상수의 추론 (Literal Type)

let으로 선언한 변수와 달리, const로 선언한 상수는 값이 변하지 않으므로 가장 좁은 타입(Literal Type) 으로 추론된다.

const num = 10;
// number가 아니라 '10' (Number Literal) 타입으로 추론

const str = "hello";
// string이 아니라 '"hello"' (String Literal) 타입으로 추론

2-3. 최적 공통 타입 (Best Common Type)

배열에 다양한 타입의 요소를 넣으면, 타입스크립트는 해당 요소들을 모두 포괄할 수 있는 최적의 공통 타입(Union Type) 을 추론한다.

let arr = [1, "string"];
// (string | number)[] 타입으로 추론 [cite: 259]

3. 요약: 타입 추론 메커니즘 시각화

위에서 살펴본 letconst, 그리고 any의 진화 과정을 시각적으로 정리하면 다음과 같다.

Diagram Nov 27 2025.png

핵심 요약

  1. 일반 변수: 초기값을 기준으로 타입 추론 (let은 범용 타입, const는 리터럴 타입).
  2. 구조 분해 & 함수: 매개변수 기본값이나 리턴값을 통해서도 추론 가능.
  3. Any의 진화: 초기값 없는 변수는 할당되는 값에 따라 타입이 계속 변하는 독특한 특징을 가진다.
  4. 최적 공통 타입: 여러 타입이 섞이면 Union 타입으로 추론된다.
@taemni

@taemni

안녕하세요, 차근차근 성장 중인 조태민입니다.

instagram

댓글