CodeBlanks Logo Icon CodeBlanks

Compile-time güvenlik

Derleme zamanı güvenliğini garanti etmeyi öğrenirsin.

Compile-time güvenlik

Exhaustive check ile derleme zamanı güvenliği sağlanır. Yeni bir union üyesi eklendiğinde, tüm switch'lerdeki case'ler artık tükenmiş değildir; assertNever çağrısı derleme hatası verir ve eksik yerleri bildirir. Bu, çalışma zamanı hatalarını önler.

type Status = "pending" | "paid" | "shipped";

function label(s: Status): string {
  switch (s) {
    case "pending": return "Beklemede";
    case "paid": return "Ödendi";
    case "shipped": return "Gönderildi";
    default: return assertNever(s);
  }
}

Çalışma zamanı vs derleme zamanı

assertNever fonksiyonu çalışma zamanında throw yapar; asıl değeri derleme zamanındadır. Eğer tüm case'ler yazılırsa, default dalına hiç gelinmez ve throw asla çalışmaz. Asıl koruma, derleyicinin eksik case'i yakalamasıdır.

function assertNever(x: never): never {
  throw new Error("Unexpected: " + x);
}

// Tüm case'ler yazılıysa default'a hiç gelinmez
// assertNever asla çağrılmaz

Uygulama Status label with exhaustive check

assertNever(x: never): never fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). Status = "pending" | "paid" | "shipped" union türünü tanımla. label(s: Status): string fonksiyonunu switch (s) ile yaz: pending için "Beklemede", paid için "Ödendi", shipped için "Gönderildi", default için return assertNever(s); yaz. console.log(label("shipped")) ile sonucu yazdır.

Başlangıç kodu

index.ts
// assertNever fonksiyonunu tanımla (never parametre, never dönüş, throw içersin)

// Status union türünü tanımla (pending, paid, shipped)

// label fonksiyonunu switch ile yaz, default'ta assertNever çağır

// "shipped" durumunun etiketini yazdır

Örnek çözüm

index.ts
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

type Status = "pending" | "paid" | "shipped";

function label(s: Status): string {
  switch (s) {
    case "pending":
      return "Beklemede";
    case "paid":
      return "Ödendi";
    case "shipped":
      return "Gönderildi";
    default:
      return assertNever(s);
  }
}

console.log(label("shipped"));

Beklenen çıktı

Gönderildi

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Exhaustive check derleme zamanı güvenliğini nasıl sağlar?

  • Çalışma zamanında throw yapar
  • Tüm case'leri otomatik yazar
  • Yeni üye eklendiğinde eksik case'leri derleyici bildirir Doğru cevap
  • never türünü kaldırır

Açıklama: Yeni üye eklendiğinde, eksik case'lerin bulunduğu switch'lerde default dalındaki değişken never olmaz; assertNever çağrısı derleme hatası verir ve eksik yerleri bildirir.

2 Status exhaustive switch

Soru
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

type Status = "pending" | "paid" | "shipped";

function label(s: Status): string {
  switch (s) {
    case "pending": return "Beklemede";
    case "paid": return "Ödendi";
    case "shipped": return "Gönderildi";
    default:
      return ____;
  }
}
Cevap
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

type Status = "pending" | "paid" | "shipped";

function label(s: Status): string {
  switch (s) {
    case "pending": return "Beklemede";
    case "paid": return "Ödendi";
    case "shipped": return "Gönderildi";
    default:
      return assertNever(s);
  }
}

Açıklama: default dalında assertNever(s) çağrısı, s never değilse (yani bir case eksikse) derleme hatası verir; bu, derleme zamanı güvenliğini sağlar.

3 Compile-time güvenlik parçaları

Kavram Anlamı
assertNever(x: never) parametresi never olmalı
Tüm case'ler default'a gelinmez
Yeni üye eklenince eksik case derleyicide hata
Derleme zamanı asıl güvenlik burada

İleri seviye bölümündeki tüm dersler