타입스크립트는 타입 추론을 적극적으로 수행한다. 타입 추론이 된다면 명시적 타입 구문은 필요하지 않으므로 사실 타입스크립트의 많은 타입 구문은 불필요한 경우가 많다. 타입은 복잡한 객체도 추론할 수 있으므로 객체를 선언할 때도 타입을 생략하고 작성해도 된다.
타입스크립트는 때론 우리가 직접 작성한 타입보다 정확하게 타입을 추론한다.
const foo : string = 'foo'
const bar = 'bar' // type is 'bar'
위 코드의 경우에도 우리가 직접 작성한 string값보다 타입스크립트가 추론한 ‘bar’라는 값이 더 정확한 추론이다.
타입이 추론 될 경우 리팩토링 역시 더 용이해진다. interface를 따로 선언할 경우 해당 변수의 값과 interface의 타입을 모두 변경해야 하므로 값만을 변경했을 경우 type error가 발생할 수 있다.
즉 정보가 부족해서 타입스크립트가 스스로 타입을 판단하기 어려운 상황을 제외하고는 타입을 명시적으로 선언하는 것은 불필요하다.
정확한 타입 추론에도 불구하고 타입을 명시하고 싶은 경우도 있다.
객체 리터럴을 정의할 때
→ 타입을 명시할 경우 잉여 속성 체크가 동작하므로 타입을 명시할 경우 할당하는 시점에 요류를 알 수 있다.
함수의 반환값
→ 구현상의 오류가 함수를 호출한 곳까지 영향을 미치지 않도록 하기 위해 타입 구문을 명시하는 게 좋다.
→ 추후에 코드가 변경되어도 함수의 시그니처가 쉽게 바뀌지 않아 함수에 대해 더 명확하게 알 수 있다.
→ 명명된 타입을 사용할 수 있다.
자바스크립트에서는 한 변수를 다른 목적을 가지는 다른 타입으로 재사용해도 되지만 타입스크립트에서는 그럴 경우 에러가 발생한다.
한 변수에서 다른 두 가지 타입을 사용하고 싶을 경우 union을 활용하여 확장할수도 있지만 서로 관련없는 코드를 단순히 재사용하는 것이라면 별도의 변수를 도입하는 것이 더 좋다.
다른 타입에 별도의 변수를 사용하는 것이 더 좋은 아유는 다음과 같다.
위와 같은 이유로 타입이 바뀌는 변수는 되도록 피해야 하며 목적이 다른 곳에는 별도의 변수명을 사용해야 혼란을 방지할 수 있다.
<이펙티브 타입스크립트> Dan Vanderkam, 프로그래밍 인사이트 (2021)