TypeScript 타입 추론¶
개요¶
매번 변수에 타입을 일일이 적지 않아도 TypeScript가 스스로 타입을 알아맞히는 걸 타입 추론이라고 해요. 코드가 동작하게 하는 데 추론이 어디서 어떻게 일어나는지 알면, "왜 이 값이 이 타입이지?" 하는 의문이 줄고 타입을 어디에 명시해야 할지도 감이 와요.
핵심 개념¶
타입 추론은 변수 초기화, 멤버 초기화, 파라미터 기본값, 함수 반환 타입 결정에서 일어나요.
여기서 두 가지 미묘한 메커니즘을 더 봐요.
- Best common type(최선의 공통 타입) — 여러 표현식에서 타입을 추론할 땐 "모두와 호환되는 최선의 타입"을 골라요.
let x = [0, 1, null]은 후보가number와null이라(number | null)[]로 추론돼요. 다만let zoo = [new Rhino(), new Elephant(), new Snake()]처럼 후보들 사이에 어떤 게 super type도 아닐 땐(Rhino | Elephant | Snake)[]로 남아요. 그럴 때let zoo: Animal[] = [...]처럼 명시적으로 타입을 넣어 의도를 알려줘야 해요. - Contextual typing(문맥적 타입 지정) — 추론은 한 방향(값 → 타입)으로만 흐르지 않아요. 표현식이 놓인 위치가 타입을 역으로 정해주기도 해요.
window.onmousedown = function (mouseEvent) { ... }를 쓰면onmousedown이 이미 가지고 있는 타입 덕분에mouseEvent파라미터가MouseEvent로 추론돼요. 그래서 mouseEvent에 없는 속성을 쓰면 바로 오류가 나죠. 함수 호출 인자, 할당 오른쪽, 타입 단언, 객체·배열 리터럴, return 문 등이 문맥적 타입 지정이 일어나는 흔한 자리예요.
여기서 핵심은, 문맥적 타입이 없다면 콜백 파라미터는 자동으로 any가 되고 오류가 안 난다는 점이에요. 그래서 noImplicitAny 같은 엄격 옵션을 켜두지 않으면 그 any가 코드에 스며들 수 있죠. 문맥적 타입은 또 best common type의 후보가 되어, 함수 반환 타입 같은 곳에서도 함께 작용해요.
실제 적용(데이터스케쳐스 관점)¶
추론을 온전히 믿되, 경계에서는 명시하자는 게 데이터스케쳐스에서 타입을 다루는 실제 기준이에요. 리터럴로 초기화되는 상수, 이벤트 콜백처럼 문맥이 타입을 정해주는 자리는 추론에 맡겨도 안전해요. 반대로 "이 배열은 결국 Animal[]이다"처럼 추론이 의도를 못 따라갈 때나, 함수가 어떤 타입을 반환하는지 명확히 해야 할 때는 명시적으로 적어요.
캔버스/웹빌더에서 특히 신경 쓰는 건 noImplicitAny와 같은 엄격 옵션이에요. 문맥적 타입이 없는 일반 함수 파라미터는 any로 추론될 수 있는데, 그게 조용히 퍼지면 타입 검사가 무의미해져요. 엄격 모드를 켜 두면 그런 any를 즉시 잡아줘서, 추론이 주는 편리함은 누리면서 약점은 막는 구조예요. 요약하면, "추론이 명확한 곳은 코드를 짧게, 흐릿한 곳은 타입을 명시" — 이게 타입 추론을 실용적으로 쓰는 방식이에요.
더 알아보기¶
- 공식 문서 (1차): TypeScript — Type Inference, 엄격 옵션(tsconfig)
- 상위 개념: TypeScript
- 관련 챕터: 인터페이스 vs 타입 · 유틸리티 타입