typescript-eslint에서 중첩된 any 잡기
Source: Dev.to
Background
오픈 소스 기여를 위해 TypeScript 린팅 분야에서 계속 작업하기로 했고, no-unsafe-* 규칙군이 객체 인수 내부에 중첩된 any를 잡아내도록 하는 기능 요청을 선택했습니다. no-unsafe-argument와 no-unsafe-assignment 규칙 문서를 읽어 현재 동작 방식을 이해했고, 왜 중첩된 any가 빠질 수 있는지—예를 들어 { foo: any }를 { foo: number }를 기대하는 함수에 전달할 때—를 파악했습니다. 이 규칙들은 unsafe any가 호출이나 할당으로 퍼지는 것을 방지하기 위해 존재하므로, 이 격차를 메우는 것은 이론이 아니라 실제 애플리케이션에 중요합니다. 또한 비용을 염두에 두고 typed‑linting 성능에 관한 프로젝트 가이드를 검토했습니다.
Implementation
주된 변경점은 체크러가 최상위 수준만 보는 것이 아니라 구조 내부까지 살펴보도록 만든 것입니다. 이제 객체, 배열, 튜플, 유니온 등 유사한 형태를 순회합니다. 중첩된 any를 발견하면 이를 보고하고, 동일한 라인에 대해 두 개의 오류가 출력되지 않도록 하여 메시지를 명확하게 유지합니다.
- 정확히 재현이 실패하는지 확인하는 테스트를 추가했습니다.
- 체크러가 더 엄격해지면서 실패하기 시작한 레포의 몇몇 작은 부분을 수정했습니다(예:
any타입으로 퍼지는 값을 스프레드하던 곳).
일반적인 경우를 빠르게 처리하기 위해 단락 회로(short‑circuit) 검사와 내장 라이브러리 타입을 건너뛰는 가드를 추가해 사용자에게 불필요한 잡음을 줄였습니다.
Challenges and Learnings
이 문제는 매우 까다로운 이슈였습니다; 타입 재귀 로직을 풀고 엣지 케이스를 다루는 데 많은 시간을 투자했습니다. 이를 통해 typed linting이 내부적으로 어떻게 동작하는지 많이 배웠습니다. 또한 다음을 배우게 되었습니다:
- 먼저 측정하고, 소스 타입에
any가 명확히 없을 경우 조기에 종료하도록 설계하기. - 오류 메시지를 전체 객체가 아니라 정확히 unsafe한 지점에 초점을 맞추기.
typed‑linting 개요와 성능 노트를 읽으며 이러한 가드레일을 설계하는 데 도움이 되었습니다.