Bölüm 6: Gelişmiş Tip Özellikleri (Advanced Types)

Şimdi geldik TypeScript’in mantıksal derinliğini gösteren, hata önlemeyi maksimuma çıkaran, oldukça önemli bir konuya:
Bu bölümde neler öğreneceğiz?
- Type Inference (tip çıkarımı): TypeScript tipi kendisi nasıl anlar?
- Type Guard (tip kontrolü): Bir değerin gerçek tipini nasıl güvenli biçimde kontrol ederiz?
- Type Assertion (
as
): TS’in algılayamadığı yerlerde tipi nasıl kendimiz belirtiriz? in
,typeof
,instanceof
,custom type guard
gibi ifadeler ne işe yarar?- Gerçek dünya örnekleriyle kavramları tam olarak oturtmak
6.1 Type Inference (Tip Çıkarımı)
Tanım: Type Inference, bir değişken tanımlarken TypeScript’in tipini otomatik olarak çıkarmasıdır.
1let name = "Yasin"; // string2let age = 30; // number3let isActive = true; // boolean
➡️ Burada hiçbir tip yazmadık ama TS, değerlerden tipi anladı. Bu gayet kullanışlıdır.
Problemli Durum:
1let user; // ❌ user: any2user = "Ali";3user = 123; // 💥 Güvenlik yok
➡️ Eğer değer atamadan sadece let user;
derseniz, user: any
olur. Bu da TS’in tip kontrolünü bırakması anlamına gelir.
✅ Çözüm: ya başlangıç değeri verin ya da tip belirtin.
1let user: string | number;
6.2 Type Guards – Tip Kontrol Yöntemleri
Union tipleri kullandığınızda (string | number
gibi), çalışma zamanında bir değerin hangi tipte olduğunu anlayıp ona göre işlem yapmalısınız. Bunun için Type Guard'lar kullanılır.
1️⃣ typeof
ile Tip Koruma
1function handleValue(val: string | number) {2if (typeof val === "string") {3console.log(val.toUpperCase());4} else {5console.log(val.toFixed(2));6}7}
➡️ typeof
sadece şu türlerle çalışır: "string"
, "number"
, "boolean"
, "undefined"
, "object"
, "function"
2️⃣ instanceof
ile Class Tipi Koruma
1class Dog {2bark() {3console.log("Hav hav!");4}5}67class Cat {8meow() {9console.log("Miyav!");10}11}1213function makeSound(animal: Dog | Cat) {14if (animal instanceof Dog) {15animal.bark();16} else {17animal.meow();18}19}
✅ instanceof
sadece class'larda çalışır, plain object’lerde değil.
3️⃣ in
Operatörü ile Alan Kontrolü
1type Admin = { role: "admin"; accessLevel: number };2type Guest = { role: "guest"; expiresIn: number };34function showUser(user: Admin | Guest) {5if ("accessLevel" in user) {6console.log("Admin seviyesi:", user.accessLevel);7} else {8console.log("Misafir süresi:", user.expiresIn);9}10}
➡️ in
operatörü bir nesnede bir alanın olup olmadığını kontrol eder.
6.3 Type Assertion (as
) – Tipi Elle Belirtmek
Tanım: TypeScript’in bir nesnenin türünü doğru anlayamadığı durumlarda bizim kesin olarak belirttiğimiz tip.
1const input = document.getElementById("email") as HTMLInputElement;2input.value = "hello@example.com";
Tehlike:
1const user = {} as User;
Bu durumda aslında user
tamamen boş olsa bile TS onu User
gibi görür. Bu çok tehlikeli olabilir.
✅ En güvenli yöntem: Type Guard kullanmak.
1const input = document.getElementById("email");23if (input instanceof HTMLInputElement) {4input.value = "hello@example.com";5}
6.4 Custom Type Guard Fonksiyonları – is Type
Tanım: Kendi kontrol fonksiyonumuzu yazarız ve TS'e şu objeyi şu tipe daralt diyebiliriz.
1type Admin = { role: "admin"; accessLevel: number };2type Guest = { role: "guest"; expiresIn: number };3type User = Admin | Guest;45function isAdmin(user: User): user is Admin {6return user.role === "admin";7}
Kullanımı:
1function displayInfo(user: User) {2if (isAdmin(user)) {3// user artık Admin olarak tanınır4console.log("Admin Seviyesi:", user.accessLevel);5} else {6console.log("Misafir süresi:", user.expiresIn);7}8}
✅ Bu sayede TypeScript user
'ın tipini doğru şekilde daraltır.
Uygulama: API Response Modelleme
1type Loading = { state: "loading" };2type Success = { state: "success"; data: string };3type Error = { state: "error"; message: string };45type FetchState = Loading | Success | Error;67function renderResult(result: FetchState) {8switch (result.state) {9case "loading":10return "Yükleniyor...";11case "success":12return `Veri: ${result.data}`;13case "error":14return `Hata: ${result.message}`;15}16}
Açıklama:
state
alanı “discriminator” olarak görev yapar.switch-case
içinde TypeScript doğru yapıya daraltma yapar.
✅ En iyi tip güvenliği ve otomatik öneri deneyimi bu şekilde elde edilir.
Alıştırmalar
typeof
,instanceof
vein
operatörlerini örneklerle dene.string | number | boolean
tipi alan birprintInfo()
fonksiyonu yaz.- Custom guard fonksiyonu (
isAdmin()
) yazarakUser
tipini ayır. - DOM'dan alınan bir input’u güvenli şekilde tip belirterek değerini yazdır.
Bölüm Özeti
Konu | Açıklama |
---|---|
Type Inference | TS tipi otomatik çıkarır |
Type Guard | Gerçek tip kontrolünü sağlar |
typeof | Basit tipler için kontrol |
instanceof | Sınıf bazlı nesneler için |
in | Nesnede alan kontrolü |
as | Tipi elle belirtme (güvenli değilse kaçınılmalı) |
user is Type | Özel guard fonksiyonu ile daraltma |
Discriminated Union | status gibi alanlarla otomatik tip kontrolü |
Bu Bölümle Artık:
- Bir değerin hangi tipte olduğunu güvenli şekilde kontrol edebilirsin.
- Tip karmaşasını önleyebilir, runtime hatalarının önüne geçebilirsin.
as
,typeof
,instanceof
,in
,is Type
gibi yapıları doğru yerlerde kullanarak projenin güvenliğini artırabilirsin.- API durumlarını, UI varyasyonlarını ve React bileşenlerini çok daha sağlam hale getirebilirsin.