타입 추론(Type Inference)은 표기가 없어도 컴파일러가 값의 타입을 정하는 단계이고, 타입 검사(Type Checking)는 정해진(추론됐거나 명시된) 타입을 코드가 지키는지 확인하는 단계다. 보통 추론이 먼저 일어나고, 그 결과를 기준으로 검사한다.
let count = 10 // 추론: number
count = 'hello' // 검사: string은 number에 넣을 수 없음 ❌추론이 일어나는 곳
- 변수 초기값, 함수 반환값, 구조 분해
- 문맥적 타이핑(Contextual Typing): 위치가 타입을 알려 준다.
addEventListener('click', e => …)의e는'click'덕분에MouseEvent가 된다 const status = 'success'는 리터럴 타입(Literal Type)'success',let status = 'success'는string으로 넓게 추론된다. 바뀔 수 있는지가 기준이다
검사가 보는 것
- 필요한 속성이 다 있는가(구조 비교, 구조적 타이핑)
- 객체 리터럴에 없는 속성을 더 넣지 않았나(초과 속성 검사, Excess Property Checking)
- 함수 인자가 매개변수 타입에 맞는가
추론이 너무 넓게(any) 잡히거나 의도와 다르면 표기를 달아 보정한다. 그런데 : Type 표기는 추론 결과를 덮어써서 구체적인 정보가 사라진다. 검사는 받되 추론은 유지하고 싶을 때 쓰는 것이 satisfies다. 추론을 포기하는 any는 피한다. 추론된 결과를 다시 좁히는 방법은 타입 좁히기와 타입 가드이다.