Generic'ler
Generic'ler: Generic, boş bırakılan kutucuklarla basılmış bir form şablonu gibidir — 'Liste' yazan formun kendisi henüz neyin listesi olduğunu söylemez, formu kullanan kişi 'Sayı
Generic, boş bırakılan kutucuklarla basılmış bir form şablonu gibidir — 'Liste' yazan formun kendisi henüz neyin listesi olduğunu söylemez, formu kullanan kişi 'Sayı Listesi' ya da 'İsim Listesi' diye doldurarak belirler. Peki her liste türü için ayrı ayrı form basmak (sayı için bir fonksiyon, isim için başka bir fonksiyon) yerine neden tek bir doldurulabilir şablona ihtiyaç duyulsun? Çünkü aynı mantığı (sıralama, filtreleme, ekleme) her tip için tekrar tekrar yazmak hem kod tekrarı hem de bakım kabusu demektir — Java'da `List ` zaten bu doldurulabilir şablon mantığını sağlıyordu, TypeScript'in generic'leri birebir aynı fikri taşır. QA'da somut faydası: `function getFirst (items: T[]): T` gibi tek bir generic fonksiyon, hem test case listesinde hem kullanıcı listesinde hem hata mesajı listesinde çalışır ve her durumda doğru tipi geri döndürür — generic olmadan ya `any` ile tip güvenliğini kaybedersiniz ya da her liste tipi için ayrı fonksiyon yazmak zorunda kalırsınız.
Java'da generics: ArrayList , Map . TypeScript'te aynı şey: Array , Map . Fonksiyon generic'leri: function identity (x: T): T. Java'dan zaten tanıdık — sözdizimi biraz farklı.
function identity (value: T): T — T çağrı anında belirlenir, sihir değil
— T'nin belirli bir şekle sahip olmasını zorunlu kılar
Box , Box , Box — aynı sınıf, farklı tipler, tip güvenliği korunur
Generic bir fonksiyon tasarımının adımlarını sırala:
Tip parametresini ile tanımla
Gerekiyorsa T extends ile kısıtla
T'yi parametre ve dönüş tipinde kullan
TypeScript T'yi çağrı anında çıkarır
function findMax (items: T[]): T tanımında findMax([{ name: "test" }]) çağrısı ne olur?
Derleme hatası — T { value: number } şartını karşılamıyor
Çalışır — TypeScript value'yu undefined olarak kabul eder
Runtime hatası verir