TypeScript는 강력한 타입 유추 시스템을 가지고 있습니다. 대부분의 경우 변수, 매개변수 및 반환 값의 타입은 컨텍스트에 따라 자동으로 계산됩니다. 타입 유추에는 여러 레벨이 있습니다:
예제:
let a = 2; // number let b = [1, "a"]; // (number | string)[] window.addEventListener('click', e => { // e: MouseEvent });
제한: 컴파일러가 타입을 명확하게 유추할 수 없는 경우, 가장 넓은 타입 (보통 any)을 선택하게 되어 타입 지정의 이점을 상실하게 됩니다.
명시적으로 타입을 지정하지 않으면 함수의 인자는 타입이 지정될까요, 하지만 이후 타입이 지정된 값으로 함수가 사용되나요?
잘못된 답변: 네, TypeScript는 항상 자동으로 인자의 타입을 "귀신같이" 알아챕니다.
올바른 답변: 아니요. 함수의 컨텍스트에 타입에 대한 정보가 포함된 경우에만 인자가 타입을 갖습니다. 그렇지 않을 경우 — any 또는 다른 기본 타입이 되며, 이는 오류를 초래할 수 있습니다. 항상 입력 데이터를 명시적으로 타입 지정하는 것이 좋습니다.
예제:
function f(x) { return x.toFixed(2); // 오류: x — 타입 any }
이야기
프로젝트에서 커스텀 훅의 반환 값 타입을 명시적으로 지정하지 않아 TypeScript는 타입이
undefined일 수 있다는 것을 인식하지 못했습니다. 이로 인해 객체 메서드를 검사 없이 호출하면 런타임 오류가 발생했습니다.
이야기
혼합 타입 값을 포함하는 배열을 생성할 때 최종 타입이 자동으로
any[]배열로 유추되었습니다. 명시적인 타입이 지정되지 않아 타입 지정의 모든 이점을 잃게 되었습니다.
이야기
서비스의 입력 매개변수 검증이 타입 지정되지 않았으며 TypeScript의 "추측"에 의존하게 되었습니다. 코드베이스를 리팩토링한 후 자동 유추가 너무 일반적인 타입을 제공하여 데이터 타입 오류가 프로덕션에 배포되었습니다.