Hãy cung cấp kiểu chính xác hơn cho cả AI lẫn con người: custom rule của TypeScript ESLint để bắt kiểu trả về được khai báo rộng hơn phần triển khai
(github.com/minseong0324)Khi nhìn vào một codebase TypeScript,
ta thường khá hay bắt gặp trường hợp phần triển khai của hàm trả về giá trị hẹp hơn, nhưng kiểu trả về vẫn được để rộng hơn.
Ví dụ, có đoạn mã như sau.
type Status = "idle" | "loading" | "error";
function getStatus(isLoading: boolean): Status {
if (isLoading) return "loading";
return "idle";
}
Trong khai báo kiểu có cả error, nhưng phần triển khai thực tế chỉ trả về idle và loading.
Đoạn mã như vậy vẫn hợp lệ dưới góc nhìn của TypeScript, nhưng
nó có thể dẫn tới vấn đề như thành phần của kiểu trả về không còn được dùng sau khi refactor vẫn còn sót lại, hoặc việc khai báo kiểu trả về rộng hơn phần triển khai tiếp tục được duy trì.
Trên thực tế, tôi cảm thấy những trường hợp như thế này thường xuất hiện trong các tình huống như
• union member còn sót lại sau khi refactor
• khai báo kiểu thủ công không còn khớp với phần triển khai
• annotation kiểu hơi lỏng do AI sinh ra
Vì vậy, tôi đã thử tạo một custom rule của TypeScript ESLint để phát hiện kiểu trả về được khai báo rộng hơn phần triển khai.
https://github.com/minseong0324/eslint-plugin-no-misleading-return-type
Ví dụ, rule này nhắm tới các trường hợp như sau.
• một số member của union type không còn được trả về nữa
• khai báo là string nhưng phần triển khai thực tế chỉ trả về literal union hẹp hơn
• khai báo là Record<string, string> nhưng phần triển khai thực tế trả về object as const với các key cụ thể
• v.v.
Mục đích không phải là “đừng viết kiểu trả về”, mà là
đặt ra một guardrail để buộc ta nhìn lại xem kiểu trả về đã khai báo có thực sự khớp với phần triển khai hay không.
Vẫn còn những trường hợp phức tạp chưa được hỗ trợ và cũng còn những điểm cần cải thiện, nhưng tôi làm ra nó vì cảm thấy rằng trong thời đại AI, khi tốc độ sinh mã ngày càng nhanh hơn, sẽ càng cần những cơ chế tự động bắt kiểu "drift" như thế này.
Rất mong nhận được phản hồi.
1 bình luận
Điều tôi đặc biệt tò mò là nên xem đâu là kiểu trả về rộng được chủ đích, và từ điểm nào thì nên xem đó là kiểu trả về không khớp với phần triển khai.