← Back to NOTES 🌰 ← Back to Effective TypeScript
← 아이템 43 - 몽키 패치보다는 안전한 타입을 사용하기
noImplicitAny를 설정하고 모든 암시적 any 대신 명시적 타입 구문을 추가했을 때, 남아있는 any 타입
명시적 any 타입
아이템 38과 39의 내용에 따라 any 타입의 범위를 좁히고 구체적으로 만들어도 여전히 any 타입이다. 특히 any[]와 { [key: string] : any } 같은 타입은 인덱스를 생성하면 ([]를 쓰면) 단순 any가 되고 코드 전반에 영향을 끼친다.
서드파티 타입 선언
이 경우는 @types 선언 파일로부터 any 타입이 전파되기 때문에 특별히 조심해야 한다. noImplicitAny를 설정하고 절대 any를 사용하지 않았다 하더라도 여전히 any 타입은 코드 전반에 영향을 미친다.
프로젝트에서 any의 개수를 추적하는 방법: npm의 type-coverage 패키지 활용
npx type-coverage
결과 예: 9985 / 10117 98.69%
프로젝트의 10,117개 심벌 중 9,985개가 any가 아니거나 any의 별칭이 아닌 타입을 가지고 있음
npx type-coverage --detail
결과 예: path/to/code.ts:1:10 getColumnInfo; path/to/module.ts:7:1 pt2 …
any 타입이 있는 곳을 모두 출력
any가 등장하는 몇 가지 문제와 그 해결책
표 형태의 데이터에서 어떤 종류의 열(column) 정보를 만들어 내는 함수
function getColumnInfo(name: string): any { return utils.buildColumnInfo(appState.dataSchema, name); // any를 반환 }
utils.buildColumnInfo 호출이 any를 반환하기 때문에 getColumnInfo 함수의 반환에 명시적으로 : any 구문 추가
이후 타입 정보를 추가하기 위해 ColumnInfo 타입을 정의하고 utils.buildColumnInfo가 any 대신 ColumnInfo를 반환하도록 개선해도 getColumnInfo 함수의 반환문에 있는 any 타입이 모든 정보를 다시 날려 버리게 된다. 즉, getColumnInfo에 남아있는 any까지 제거해야 문제가 해결된다.