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

Tip Korumalar

Tür daraltma TypeScript'teki en önemli kavramlardan biridir. Ancak çoğu zaman typeof veya instanceof gibi standart tip korumalar karmaşık özel nesneler için yeterli değildir. Özel Tip Korumaların devreye girdiği yer burasıdır.

Standart Tip Korumalar

TypeScript'in standart JavaScript operatörlerini kullanarak türleri nasıl daralttığını özetleyerek başlayalım:

TS
function processInput(val: string | number) {
  if (typeof val === 'string') {
    // Here 'val' is of type string
    console.log(val.toUpperCase());
  } else {
    // Here 'val' is of type number
    console.log(val.toFixed(2));
  }
}

Özel Tür Korumalar (is operatörü)

Özel bir tür koruması tanımlamak için, standart bir boole dönüş türü yerine parameterName is Type biçiminde bir tür yüklemi döndüren bir işlev yaratırız.

İşlev bir boole değeri döndürmelidir (true veya false). true değerini döndürürse TypeScript, iletilen parametrenin belirtilen türde olduğunu bilecektir.

TS
interface Cat {
  name: string;
  meow(): void;
}

interface Dog {
  name: string;
  bark(): void;
}

// This is a custom type guard
function isCat(animal: Cat | Dog): animal is Cat {
  return (animal as Cat).meow !== undefined;
}

function makeNoise(pet: Cat | Dog) {
  if (isCat(pet)) {
    // Here TypeScript knows 'pet' is a Cat
    pet.meow();
  } else {
    // Here TypeScript knows 'pet' is a Dog
    pet.bark();
  }
}

Güvenlik ve Döküm (as vs Tip Korumalar)

Tür dönüşümü (örneğin, val as Cat), derleyiciyi herhangi bir gerçek çalışma zamanı doğrulaması olmadan geliştiriciye güvenmeye zorlar. Çalışma zamanı nesnesi beklentileri karşılamıyorsa kod sessizce başarısız olur veya istisnalar atar.

Öte yandan özel tür korumaları, TypeScript derleyicisine gerçek değişken türü hakkında güvenli ve doğru bir şekilde bilgi vererek sağlam ve dinamik bir çalışma zamanı kontrolü gerçekleştirir:

TS
function processInput(input: unknown) {
  // unsafe casting: could crash if input does not have the split method
  // const str = input as string;
  // console.log(str.split(' '));

  // safe guard
  if (isString(input)) {
    console.log(input.split(' ')); // 100% Safe!
  }
}

Kendin dene

Alıştırma 1: String Tipi Koruma

Egzersiz#ts.m5.l1.e1
Denemeler: 0Yükleniyor…

Bilinmeyen bir değerin dize olup olmadığını doğrulamak için özel tür koruması görevi gören isString adında basit bir işlev oluşturun.

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

Fonksiyonun dönüş tipi val olmalıdır string ve 'string'e eşit olup olmadığını kontrol etmek için typeof kullanmalısınız.

3 denemeden sonra çözüm mevcut

Alıştırma 2: Premium Kullanıcı Türü Koruması

Egzersiz#ts.m5.l1.e2
Denemeler: 0Yükleniyor…

Kullanıcı ve PremiumUser türleri göz önüne alındığında, isPremiumUser(user: User) türünde bir koruma işlevi yazın: kullanıcı, kullanıcının 'premium' rolüne sahip olup olmadığını kontrol eden PremiumUser'dır.

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

İmzayı fonksiyon isPremiumUser(user: User) olarak tanımlayın: kullanıcı PremiumUser'dır ve user.role'u 'premium' ile karşılaştırın.

3 denemeden sonra çözüm mevcut

Alıştırma 3: Özel Hata Nesnesi Doğrulaması

Egzersiz#ts.m5.l1.e3
Denemeler: 0Yükleniyor…

isCustomError(err: bilinmiyor): err işlevini uygulayın, bilinmeyen bir değerin 'code' anahtarını içeren boş olmayan bir CustomError nesnesi olup olmadığını doğrulayan CustomError işlevidir.

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

Öncelikle typeof err'nin 'object' olup olmadığını ve boş olmadığını kontrol edin, ardından 'code' özelliğini kontrol etmek için 'in' operatörünü kullanın.

3 denemeden sonra çözüm mevcut

Alıştırma 4: Yönetici Türü Koruması

Egzersiz#ts.m5.l1.e4
Denemeler: 0Yükleniyor…

User (özellik rolüyle: string) ve Admin (User'i genişleten ve adminToken: string özelliğine sahip) iki arayüz verildiğinde, User tipinde bir kullanıcıyı kabul eden ve Admin olan kullanıcı tipini döndüren isAdmin adında bir tip koruma fonksiyonu yazın. Koruma, kullanıcının rolünün 'yönetici'ye eşit olup olmadığını kontrol etmelidir.

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

İmzayı function isAdmin(user: User): user is Admin olarak tanımlayın ve user.role === 'admin' olup olmadığını kontrol edin.

3 denemeden sonra çözüm mevcut