TypeScript’in sunduğu tip sistemi, sadece temel veri türleriyle sınırlı değildir. Daha karmaşık, esnek ve gerçek hayat senaryolarını desteklemek için gelişmiş tip özellikleri de sunar. Bu özellikler sayesinde daha güvenli ve anlaşılır kodlar yazmak mümkün olur.
Bu makalede, TypeScript’in ileri düzey tiplerinden olan union types, intersection types, literal types, nullable types ve optional erişim operatörlerini açıklayacağız.
Union Types (Birden Fazla Tip Kullanımı)
Union type, bir değişkenin birden fazla türden birine sahip olmasını sağlar. Örneğin, bir değişken hem string
hem de number
olabiliyorsa, bu durumda union type kullanılır.
let sonuc: number | string;
sonuc = 90;
sonuc = "henüz açıklanmadı";
Bu kullanım, özellikle API’den gelen verilerde ya da esnek girişlerde çok işe yarar.
Intersection Types (Tip Kesişimi)
Intersection types, birden fazla tipin birleşimiyle oluşan yeni bir tip tanımlar. Bu yeni tip, birleşen tüm tiplerin özelliklerini taşımalıdır.
type Draggable = {
surukle: () => void;
};
type Resizable = {
yenidenBoyutlandir: () => void;
};
type UIElement = Draggable & Resizable;
let pencere: UIElement = {
surukle() {
console.log("Sürükleniyor");
},
yenidenBoyutlandir() {
console.log("Boyut değiştiriliyor");
}
};
Intersection tipler, özellikle bir nesnenin birden fazla davranışı aynı anda taşıması gereken durumlarda kullanılır.
Literal Types (Sabit Değer Tipleri)
Literal types, bir değişkenin sadece belirli sabit değerleri alabilmesini sağlar. Bu, özellikle sınırlı sayıda geçerli seçenek olduğunda kullanışlıdır.
let durum: "basladi" | "beklemede" | "bitti";
durum = "basladi"; // geçerli
durum = "iptal"; // hata: 'iptal' literal tipler arasında değil
Bu sayede hatalı değerlerin atanması engellenmiş olur.
Nullable Types (null ve undefined ile Çalışmak)
Varsayılan olarak TypeScript, null
ve undefined
gibi değerlerin bir değişkene atanmasına izin vermez. Ancak bazı durumlarda verinin olmayabileceği bilinçli olarak belirtilmek istenebilir. Bu gibi durumlarda nullable types kullanılır.
let isim: string | null = null;
isim = "Ali";
Bu kullanım, değişkenin null
olabileceğini açıkça ifade eder.
strictNullChecks Ayarı
TypeScript’te strictNullChecks
ayarı açık olduğunda, bir değişkenin null
ya da undefined
olup olmadığı kontrol edilmeden kullanılmasına izin verilmez. Bu da potansiyel hataları erken aşamada yakalamayı sağlar.
Ayar, tsconfig.json
dosyasında şu şekilde etkinleştirilir:
"strictNullChecks": true
Bu ayar aktifken, TypeScript seni olası null
ve undefined
hatalarına karşı uyarır.
Optional Chaining (?.
)
Optional chaining operatörü, bir nesne veya değişkenin tanımlı olup olmadığını kontrol ederek ona ulaşmanı sağlar. Tanımsız (undefined
) olan bir nesneye doğrudan erişmeye çalışmak normalde hataya yol açar. ?.
sayesinde bu engellenir.
let musteri = {
adres: {
sehir: "İzmir"
}
};
console.log(musteri.adres?.sehir); // varsa sehir'i gösterir, yoksa hata vermez
Bu özellik sayesinde uygulamalar daha stabil çalışır.
Optional Element Access (?.[index]
)
Bir diziye erişirken, dizinin boş veya undefined
olabileceği durumlarda ?.[index]
operatörü kullanılır.
let kullanicilar: string[] | undefined;
console.log(kullanicilar?.[0]); // varsa ilk kullanıcıyı verir, yoksa hata vermez
Bu da dizilerle çalışırken hata olasılığını azaltır.
Optional Call Operator (?.()
)
Bir fonksiyon tanımlanmışsa çalıştır, tanımlanmamışsa hata verme diyorsak, optional call operator kullanılır. Bu, özellikle dışardan gelen fonksiyon referanslarında işe yarar.
let logla: ((mesaj: string) => void) | undefined;
logla?.("Sistem başladı"); // tanımlıysa çalıştırır, değilse geçer
Bu operatör, uygulamanın durmasını engelleyerek esnekliğini artırır.
Sonuç
TypeScript’in ileri düzey tip özellikleri sayesinde daha esnek, daha güvenli ve daha bakımı kolay uygulamalar geliştirmek mümkündür. Union types ile birden fazla durumu kontrol altında tutabilir, intersection types ile tipleri birleştirebilir, literal types ile belirli değerleri zorunlu kılabilir ve nullable types ile eksik verilerle doğru şekilde çalışabilirsin.
Ayrıca optional chaining ve onun çeşitleri, kodun daha kısa ve hataya dayanıklı yazılmasını sağlar. Bu özellikler, özellikle gerçek dünya uygulamalarında karşılaşılan belirsiz durumları daha sağlam şekilde yönetmek için oldukça önemlidir.
Bu temel ve ileri düzey bilgilerle, TypeScript’in tip sistemine çok daha hâkim bir şekilde projelerini geliştirmeye devam edebilirsin.