함수에서 any 타입을 반환하면 프로젝트 전반에 영향을 끼칠 가능성이 있다.
강제 타입 오류를 제거하려면 @ts-ignore 를 사용하는 것이 좋다.
any는 자바스크립트에서 표현할 수 있는 모든 값을 아우르는 매우 큰 범위이다.
any 타입을 그대로 정규식이나 함수에 넣는것은 권장되지 않는다.
any를 보다 구체적으로 모델링 할 수 있도록 any[] or () => any or {[id:string]: any 이런 식으로 사용해야 한다.
함수 모든 부분을 안전한 타입으로 구현하는 것이 이상적이지만 불필요한 예외상황까지 고려하지 않아도 된다.
함수 내부에는 타입 단언을 사용하고 함수 외부로 드러나는 타입 정의를 정확히 명시하는 정도로 해도 된다.
타입이 정의된 함수 안으로 타입 단언문을 감추는 것이 더 좋은 설계
any 타입의 진화는 암시적 any 타입에 어떤 값을 할당할 때만 발생한다.
그리고 어떤 변수가 암시적 any 상태일 때 값을 읽으려고 하면 오류가 발생한다.
any가 진화하는 방식은 일반적인 변수가 추론되는 원리와 동일.
타입을 안전하게 설계하기 위해서 암시적 any를 진화시키는 방식보다 명시적 타입 구문을 사용하는 것이 좋다.
unknown은 any 대신 쓸 수 있는 타입 시스템에 부합하는 타입이다.
unknown은 어떠한 타입이든 할당이 가능하지만 오직 unknown과 any에만 할당이 가능하다.
반면 never는 어떤 타입도 never에 할당 할 수 없지만 어떠한 타입으로도 할당이 가능하다.
unknown인 값에 함수 호출을 하거나 연산을 하려고 하면 오류가 발생하기 때문에 적절한 타입으로 변환하도록 강제해야 한다.
자바스크립트는 객체와 클래스에 임의의 속성을 추가할 수 있을만큼 유연성을 가진다.
전역 변수를 사용하면 프로그램내에서 의존성이 만들어져 side effect가 발생할 수 있다. 데이터를 분리하여 사용해야 한다.
분리할 수 없는 경우
1. interface의 특수 기능은 보강(augmentation) 사용
2. 더 구체적인 타입 단언문 사용
보강(augmentation)을 사용한 방법이 any보다 나은 점
noImplicitAny를 설정하고 모든 암시적 any 대신 명시적 타입 구문을 추가해도 any 타입과 관련된 문제들로부터 안전하다고 할 수 없다.
any 타입은 타입 안전성과 생산성에 부정적 영향을 미칠 수 있어 프로젝트에서 추적이 가능해야한다.