ProgramlamaFrontend Geliştirici

REST ve parametrelerin yapısının türlendirilmesi TypeScript'te nasıl çalışır? Yanlış türlendirme ile ilgili hangi hatalar ortaya çıkar?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

TypeScript, rest parametreleri ve yapısal ayırma (destructuring) kullanarak fonksiyonların kesin türlendirilmesini desteklemektedir. Bu, değişken sayıda argüman alan veya karmaşık nesnelerle çalışan fonksiyonlar için özellikle önemlidir.

Fonksiyon parametrelerinde yapısal ayırma, beklenen özelliklerin yapısını açıkça belirtmeyi sağlar:

function printUser({ name, age }: { name: string; age: number }) { console.log(`${name} (${age})`); }

Rest parametreleri, değişken sayıda argümanın türünü belirtmeyi mümkün kılar:

function sum(...numbers: number[]): number { return numbers.reduce((acc, cur) => acc + cur, 0); }

Kombine kullanımlar, ana nesnenin ve ek bir parametreler dizisinin alındığı fonksiyonlarda görülür:

function logEvent(event: { type: string }, ...meta: any[]) { console.log(event.type, meta.join(',')); }

Doğru türlendirme, kodun yürütülmesinden önce hataların belirlenmesini sağlar, ancak yanlış türlendirme, tür güvenliğinin kaybolmasına ve çalışma zamanında hatalara neden olur.

Kandırmaca Soru

Varsayılan olarak dizi parametrelerine tür atamak ve bunları isteğe bağlı (optional) hale getirmek için nasıl bir yol izlenir?

Birçok kişi nesnenin türünü belirtirken her bir alanı isteğe bağlı hale getirmeyi veya varsayılan değerleri aynı anda türle belirtmeyi unutur:

function foo({x = 1, y = 2}: {x?: number; y?: number} = {}) { console.log(x, y); }

Burada varsayılan değerler belirlenmiştir ve tüm parametreler ? ile isteğe bağlı hale getirilmiştir. Bunu yapmadan parametre olmadan çağırmak hata verecektir, oysa varsayılan değer beklenmektedir.

Gerçek Hataların Örnekleri


Hikaye

Projede bir fonksiyonun parametrelerini JavaScript'ten TypeScript'e geçirirken, sadece nesneye tür belirtilmiş, bireysel alanlara değil. Sonuç olarak, parametre olmadan fonksiyon çağırmak, undefined üzerinde name özelliği olmadığı için uygulamanın çökmesine neden olmuştur.

Hikaye

Rest parametreleri ile çalışırken, dizi türünü açıkça belirtmeyi unuttuk. Fonksiyondaki tür any[] olarak belirlendiği için sayılar dışında değerlerin geçmesine izin verildi. Üretimde, birdenbire sayılar ve stringler toplandı ve raporlarda yanlış sonuçlar elde edildi.

Hikaye

Derin yapılandırılmış bir nesne ile yapısal ayırma kullandık, ancak iç türleri belirtmedik. Bunun sonucunda TS "kayboldu" ve nesnelerde zorunlu alanların eksikliğini belirlemedi; bu da istemcide TypeError: Cannot read property 'id' of undefined hatasına yol açtı.