Yapay zekaya ve insanlara daha doğru tipler verelim: implementasyondan daha geniş tanımlanan dönüş tiplerini yakalayan bir TypeScript ESLint özel kuralı
(github.com/minseong0324)TypeScript kod tabanlarına baktığınızda,
bir fonksiyon implementasyonu daha dar değerler döndürmesine rağmen dönüş tipinin daha geniş bırakıldığı durumlarla sıkça karşılaşırsınız.
Örneğin şöyle bir kod:
type Status = "idle" | "loading" | "error";
function getStatus(isLoading: boolean): Status {
if (isLoading) return "loading";
return "idle";
}
Tip tanımında error da yer alıyor, ancak gerçek implementasyon yalnızca idle ve loading döndürüyor.
Bu tür kodlar TypeScript açısından geçerli olsa da,
refaktör sonrası artık kullanılmayan dönüş tipi üyelerinin geride kalmasına ya da
implementasyondan daha geniş dönüş tipi tanımlarının korunmaya devam etmesine yol açabiliyor.
Pratikte bu tür durumların çoğunlukla şu senaryolarda ortaya çıktığını gördüm:
•refaktör sonrasında kalan union member
•implementasyonla uyumsuz, elle yazılmış tip tanımı
•yapay zekanın ürettiği biraz gevşek tip annotation'lar
Bu yüzden
implementasyondan daha geniş tanımlanan dönüş tiplerini tespit eden bir TypeScript ESLint özel kuralı geliştirdim.
https://github.com/minseong0324/eslint-plugin-no-misleading-return-type
Örneğin şu durumları hedefliyor:
•union tipinin bazı üyeleri artık döndürülmüyor
•tip string, ama gerçek implementasyon yalnızca daha dar bir literal union döndürüyor
•tip Record<string, string>, ama gerçek implementasyon belirli anahtarlara sahip bir as const nesnesi döndürüyor
•vb.
Buradaki amaç “dönüş tipi yazmayalım” demek değil,
tanımlanan dönüş tipinin implementasyonla gerçekten eşleşip eşleşmediğini yeniden düşündüren bir guardrail koymak.
Henüz desteklenmeyen karmaşık durumlar ve iyileştirilmesi gereken noktalar var,
ama yapay zeka çağında kod üretim hızı arttıkça bu tür tip kaymalarını otomatik yakalayan mekanizmalara daha fazla ihtiyaç olduğunu düşündüğüm için bunu geliştirdim.
Geri bildirimlere açığım.
1 yorum
Özellikle merak ettiğim şey, hangi noktaya kadar bunun kasıtlı olarak geniş bir dönüş tipi sayılacağı ve hangi noktadan itibaren uygulamayla örtüşmeyen bir dönüş tipi olarak görüleceğidir.