TypeScript'in Gücü: Tip Sistemi
TypeScript'e yeni başlayanlar genellikle temel tipleri (string, number, boolean) öğrendikten sonra "TypeScript'i öğrendim" der. Oysa gerçek güç, TypeScript'in tip programlama (type-level programming) yeteneklerinde gizlidir.
1. Utility Types (Hazır Tip Yardımcıları)
TypeScript, sizi tekrarlayan tip tanımlamalarından kurtaran bir dizi hazır yardımcı tip (utility type) ile gelir:
interface Kullanici {
id: number;
ad: string;
email: string;
sifre: string;
olusturmaTarihi: Date;
}
// Partial: Tüm alanları opsiyonel yapar (güncelleme formları için ideal)
type KullaniciGuncelle = Partial;
// { id?: number; ad?: string; email?: string; ... }
// Required: Tüm alanları zorunlu yapar
type KullaniciTamDolu = Required;
// Pick: Sadece istediğin alanları seç
type KullaniciOnizleme = Pick;
// { id: number; ad: string; email: string }
// Omit: Belirli alanları dışarıda bırak
type KullaniciHerkese = Omit;
// Şifre alanı olmadan tüm kullanıcı bilgileri
// Readonly: Tüm alanları salt okunur yap (immutability için)
type KullaniciSabitler = Readonly;
2. Mapped Types (Eşleştirilmiş Tipler)
Mevcut bir tipin üzerinden geçerek yeni bir tip üretebilirsiniz:
// Her bir alanı opsiyonel ve nullable yapan custom mapped type
type NullablePartial = {
[K in keyof T]?: T[K] | null;
};
type KullaniciNullable = NullablePartial;
// { id?: number | null; ad?: string | null; ... }
// Her alanın değer tipini string'e dönüştüren mapped type
type Stringify = {
[K in keyof T]: string;
};
// API yanıtlarını JSON string olarak temsil etmek için kullanışlı
type KullaniciJSON = Stringify;
3. Conditional Types (Koşullu Tipler)
En güçlü TypeScript özelliklerinden biri, tiplerin diğer tiplere göre şekillenebilmesidir:
// Temel conditional type
type IsString = T extends string ? 'evet' : 'hayır';
type Test1 = IsString; // 'evet'
type Test2 = IsString; // 'hayır'
// Pratik örnek: Promise'i çöz
type Awaited = T extends Promise ? R : T;
type Sonuc1 = Awaited>; // string
type Sonuc2 = Awaited; // number
// Dizi ise eleman tipini döndür, değilse T'yi döndür
type Unarray = T extends Array ? Item : T;
type Tip1 = Unarray; // string
type Tip2 = Unarray; // number
4. Template Literal Types
type Renk = 'kirmizi' | 'mavi' | 'yesil';
type Boyut = 'kucuk' | 'orta' | 'buyuk';
// Karteziyen çarpım: tüm kombinasyonları üret
type Kombinasyonlar = `${Boyut}-${Renk}`;
// 'kucuk-kirmizi' | 'kucuk-mavi' | 'kucuk-yesil' | 'orta-kirmizi' | ...
// Event handler isimlerini tip güvenli hale getirme
type EventIsmi = 'tikla' | 'yukleme' | 'hata';
type Handler = `on${Capitalize}`;
// 'onTikla' | 'onYukleme' | 'onHata'
Bu tip özellikler özellikle kütüphane yazarken, genel API'lar tasarlarken ve büyük ekiplerde tip güvenliğini maksimize etmek istediğinizde çok değer katar. Küçük projelerde aşırı kullanmak kodu okunaksız hale getirebilir.
