📑 목차
타입스크립트를 사용하다 보면 모든 변수에 일일이 타입을 정의하지 않아도 코드가 잘 동작하는 것을 볼 수 있다. 이는 타입스크립트가 변수의 타입을 자동으로 파악하는 "타입 추론(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. 요약: 타입 추론 메커니즘 시각화
위에서 살펴본 let과 const, 그리고 any의 진화 과정을 시각적으로 정리하면 다음과 같다.

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