Ana içeriğe geç
Modül 3 · Ders 2 ders 2Kurstaki 6/14~15 min
Modül dersleri (2/2)

Temel Jenerikler

Geneller (genel programlama), TypeScript'in en güçlü özelliklerinden biridir. Maksimum tür güvenliğini korurken ve any kullanımını ortadan kaldırırken, farklı veri türleriyle çalışabilen esnek, yeniden kullanılabilir bileşenler, işlevler ve arayüzler yazmanıza olanak tanır.


Genel Fonksiyonlar

Jeneriği türler için bir değişken olarak düşünün. Kendisine argüman olarak iletilen değeri döndüren bir fonksiyon düşünelim:

TS
function identity<T>(arg: T): T {
  return arg;
}

T harfi (Type'ın kısaltması) tür için bir yer tutucudur. identity çağırdığımızda, TypeScript iletilen bağımsız değişkenin türünü yakalar ve T öğesini otomatik olarak bu türe ayarlar:

TS
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)

Genel Arayüzler ve Takma Adlar

Jenerikler ayrıca genel kapsayıcıları veya veri yapılarını tanımlamak için arayüzlere ve tür takma adlarına da uygulanabilir:

TS
interface Box<T> {
  content: T;
}

const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };

Çoklu Tip Parametreleri

Birden çok tür değişkeni kullanan işlevleri veya türleri tanımlayabiliriz (örneğin, T ve U):

TS
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

Genel Kısıtlamalar

Bazen bir jenerik tarafından kabul edilen türleri sınırlamak isteriz. Kısıtlama eklemek için extends anahtar kelimesini kullanabiliriz.

Örneğin, genel türün her zaman length özelliğine sahip olmasını istiyorsak (dizeler veya diziler gibi):

TS
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length); // Safe! We know arg has 'length'
}

logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!

Kendin dene

Alıştırma 1: Genel Kimlik İşlevi

Egzersiz#ts.m3.l2.e1
Denemeler: 0Yükleniyor…

Genel kimlik işlevini, T genel türünde bir değer parametresini kabul edecek ve onu değişiklik yapmadan döndürecek şekilde tamamlayın.

Düzenleyici yükleniyor…
İpucu göster

Dönüş türü, parametreyle aynı genel T türü olmalıdır.

3 denemeden sonra çözüm mevcut

Alıştırma 2: Genel Kutu Paketleyici

Egzersiz#ts.m3.l2.e2
Denemeler: 0Yükleniyor…

T tür parametresini kabul eden ve T türünün içeriği adlı tek bir özelliğe sahip olan Box adlı genel bir arabirim tanımlayın.

Düzenleyici yükleniyor…
İpucu göster

Box<T> arayüzünü kullanın { content: T; } sözdizimi.

3 denemeden sonra çözüm mevcut

Alıştırma 3: Genel Kısıtlama

Egzersiz#ts.m3.l2.e3
Denemeler: 0Yükleniyor…

arg parametresini kabul eden, getLength adında genel bir işlev yazın. arg, uzunluk özelliğine (sayı) sahip bir arayüzle sınırlandırılmalıdır. İşlev arg.length değerini döndürmelidir.

Düzenleyici yükleniyor…
İpucu göster

Fonksiyonu getLength<T extends HasLength>(arg: T): sayı olarak bildirin ve arg.uzunluğunu döndürün.

3 denemeden sonra çözüm mevcut

Alıştırma 4: Genel Çift

Egzersiz#ts.m3.l2.e4
Denemeler: 0Yükleniyor…

İki özelliğe sahip genel bir Pair<T, U> arabirimi tanımlayın: birincisi T türünden ve ikincisi U türünden. Daha sonra, birinciyi (T türünden) ve ikinciyi (U türünden) kabul eden ve Pair<T, U> uygulayan bir nesne döndüren genel bir makePair işlevi oluşturun.

Düzenleyici yükleniyor…
İpucu göster

İki genel parametre Pair<T, U> için sözdizimini kullanın ve makePair'i buna göre tanımlayın.

3 denemeden sonra çözüm mevcut