TypeScript는 정적 타입 언어이지만, 모든 변수와 함수에 타입을 직접 작성할 필요는 없습니다. 그 이유는 TypeScript 컴파일러가 코드의 문맥을 분석해 자동으로 타입을 추론(Type Inference)하기 때문입니다.
타입 추론이란?
타입 추론(Type Inference)은 TypeScript가 코드에서 명시된 값, 실행 문맥 등을 바탕으로 자동으로 적절한 타입을 결정하는 기능입니다.
예를 들어, 다음과 같은 코드에서 TypeScript는 별도의 타입 지정 없이도 변수 타입을 추론합니다.
let age = 30;
// age는 number로 추론됨
let username = "Alice";
// username은 string으로 추론됨
이처럼 초기값이 있는 변수는 그 값으로부터 타입을 자동으로 결정합니다.
변수 초기화에서의 추론
가장 일반적인 타입 추론은 변수 초기화에서 발생합니다.
let isActive = true;
// boolean으로 추론
let count = 0;
// number로 추론
초기값을 기반으로 타입이 자동 결정되며, 이후 다른 타입의 값을 넣으면 오류가 발생합니다.
count = "10";
// ❌ 오류: string을 number 변수에 할당할 수 없음
함수에서의 타입 추론
1. 반환 타입(Return Type) 추론
함수는 반환값을 기반으로 자동으로 타입을 추론합니다.
function add(a: number, b: number) {
return a + b;
}
// 반환 타입은 number로 추론됨
2. 콜백 함수의 추론
JavaScript 고차 함수에서는 콜백 파라미터의 타입을 자동으로 추론합니다.
const ids = [1, 2, 3];
ids.map(id => id * 2);
// id는 number로 자동 추론됨
이 기능 덕분에 map, filter, reduce 같은 함수들은 거의 타입을 적지 않고도 정확한 타입이 유지됩니다.
객체(Object) 타입 추론
const user = {
id: 1,
name: "Alice",
isAdmin: false
};
TypeScript는 위 객체를 다음과 같은 타입으로 자동 추론합니다.
{
id: number;
name: string;
isAdmin: boolean;
}
하지만 객체의 속성은 초기 값 기준으로 추론된 타입이 그대로 유지됩니다.
user.id = "1";
// ❌ 오류: string을 number에 할당할 수 없음
배열(Array)의 타입 추론
배열은 포함된 요소들의 타입을 조합하여 추론합니다.
let items = [1, 2, 3];
// number[]로 추론
여러 타입이 섞여 있을 경우 Union 타입으로 추론합니다.
let mixed = [1, "hello", true];
// (number | string | boolean)[] 로 추론
상수(const) 선언과 타입 추론의 차이
let과 달리 const는 값의 변경이 불가능하므로 더 좁은 타입으로 추론됩니다.
let color = "red";
// string으로 추론
const color2 = "red";
// "red" (리터럴 타입)으로 추론
즉, const는 값을 변경할 수 없기 때문에 문자열 자체가 타입이 되는 리터럴 타입으로 추론됩니다. 상태 값이나 모드 정의 등에 매우 유용합니다.
구조 분해(Destructuring)에서의 타입 추론
const user = { id: 1, name: "Alice" };
const { id, name } = user;
// id: number
// name: string
튜플에서도 추론이 가능합니다.
const tuple = [10, "Hello"] as const;
const [count, msg] = tuple;
// count: 10
// msg: "Hello"
리터럴 단위까지 추론되는 것이 특징입니다.
타입 추론이 적용되지 않는 경우
다음과 같은 상황에서는 추론이 정확하지 않아 문제가 될 수 있습니다.
1. 빈 배열 초기화
let list = [];
// any[]로 추론됨 → 위험
해결 방법:
let list: number[] = [];
2. 너무 복잡한 함수 반환 타입
중첩된 객체나 Union 타입이 복잡하면 명시적으로 타입을 선언해주는 것이 좋습니다.
언제 타입을 명시하고, 언제 추론을 사용할까?
타입을 명시해야 하는 경우
- 함수의 public API (매개변수·반환 타입)
- 복잡한 객체 구조
- 라이브러리/프레임워크 외부 노출 타입
- 빈 배열 초기화 또는 타입 불명확 상황
타입 추론을 사용해도 좋은 경우
- 지역 변수
- 간단한 상수/변수 초기화
- map, filter, reduce 내 콜백 인자
- 간단한 객체 리터럴
“불필요한 타입 선언은 코드 가독성을 떨어뜨린다”는 것도 중요한 원칙입니다.
TypeScript의 타입 추론은 매우 강력하며, 올바르게 활용하면 코드의 안정성, 가독성, 개발 속도를 크게 향상시킬 수 있습니다. 핵심은 “타입을 명확히 해야 할 곳은 명확히, 나머지는 추론을 믿어라”는 원칙입니다.
'개발 > Typescript' 카테고리의 다른 글
| [TYPESCRIPT] any, unknown, never 차이와 올바른 사용법 -TypeScript 타입 시스템의 심장부 이해하기 (0) | 2025.11.24 |
|---|---|
| [TYPESCRIPT] 객체 타입 정의하기 - TypeScript의 구조적 타입 시스템 완전 이해 (0) | 2025.11.23 |
| [TYPESCRIPT] 배열과 튜플 다루기 - TypeScript에서 컬렉션을 안전하게 사용하는 방법 (0) | 2025.11.22 |
| [TYPESCRIPT] 기본 타입 소개 - string, number, boolean 완벽 이해하기 (0) | 2025.11.21 |
| [TYPESCRIPT] tsconfig.json 완벽 가이드 - TypeScript 프로젝트 설정의 모든 것 (0) | 2025.11.20 |
