Show GN: AI와 사람에게 더 정확한 타입을 주자: 구현보다 넓게 명시된 반환 타입을 잡는 TypeScript ESLint 커스텀 룰
(github.com/minseong0324)TypeScript 코드베이스를 보다 보면,
함수 구현은 더 좁은 값을 반환하는데 반환 타입은 더 넓게 남아 있는 경우를 종종 보게 됩니다.
예를 들면 이런 코드입니다.
type Status = "idle" | "loading" | "error";
function getStatus(isLoading: boolean): Status {
if (isLoading) return "loading";
return "idle";
}
타입 선언에는 error까지 포함되어 있지만, 실제 구현은 idle과 loading만 반환합니다.
이런 코드는 TypeScript 관점에서 유효하지만,
리팩토링 이후 더 이상 사용되지 않는 반환 타입 멤버가 남아 있거나,
구현보다 넓은 반환 타입 명시가 계속 유지되는 문제로 이어질 수 있습니다.
실제로는 이런 케이스가
•리팩토링 이후 남은 union member
•구현과 어긋난 수동 타입 명시
•AI가 생성한 다소 느슨한 타입 annotation
같은 상황에서 자주 생긴다고 느꼈습니다.
그래서
구현보다 넓게 명시된 반환 타입을 탐지하는 TypeScript ESLint 커스텀 룰을 만들어봤습니다.
https://github.com/minseong0324/eslint-plugin-no-misleading-return-type
예를 들어 이런 경우를 대상으로 합니다.
•union 타입의 일부 멤버가 더 이상 반환되지 않음
•string인데 실제 구현은 더 좁은 literal union만 반환
•Record<string, string>인데 실제 구현은 특정 key를 가진 as const 객체 반환
•등
의도는 “반환 타입을 쓰지 말자”가 아니라,
명시된 반환 타입이 구현과 정말 일치하는지 다시 보게 만드는 guardrail을 두는 것입니다.
아직 지원하지 않는 복잡한 케이스도 있고 개선해야 하는 부분도 남아 있지만,
AI 시대에 코드 생성 속도가 빨라질수록 이런 식의 타입 드리프트를 자동으로 잡는 장치가 더 필요하다고 느껴서 만들어봤습니다.
피드백 환영합니다.