CodeBlanks Logo Icon CodeBlanks

Switch exhaustive

Switch'lerde tükenmişlik kontrolünü öğrenirsin.

Switch exhaustive

Switch ifadesinde tüm case'ler yazıldıktan sonra default dalı assertNever ile bitirilirse, yeni üye eklendiğinde derleyici tüm switch'leri bulur ve eksik case'i bildirir. Bu, switch'in tükenmiş (exhaustive) olduğunu garanti altına alır.

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

type Color = "red" | "green" | "blue";

function colorName(c: Color): string {
  switch (c) {
    case "red": return "Kırmızı";
    case "green": return "Yeşil";
    case "blue": return "Mavi";
    default: return assertNever(c);
  }
}

Yeni üye eklendiğinde

Mevcut switch exhaustive iken, union'a yeni bir üye eklendiğinde tüm case'leri yazmamış switch'lerde default dalındaki c artık never değildir. assertNever(c) çağrısı derleme hatası verir ve eksik case'i bildirir.

type Color = "red" | "green" | "blue" | "yellow";  // yellow eklendi

function colorName(c: Color): string {
  switch (c) {
    case "red": return "Kırmızı";
    case "green": return "Yeşil";
    case "blue": return "Mavi";
    // yellow case eksik!
    default: return assertNever(c);  // hata: c artık "yellow" olabilir
  }
}

Uygulama Color switch ile exhaustive

assertNever(x: never): never fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). Color = "red" | "green" | "blue" union türünü tanımla. colorName(c: Color): string fonksiyonunu switch (c) ile yaz: red için "Kırmızı", green için "Yeşil", blue için "Mavi", default için return assertNever(c); yaz. console.log(colorName("blue")) ile sonucu yazdır.

Başlangıç kodu

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

// Color union türünü tanımla (red, green, blue)

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

// "blue" renginin adını yazdır

Örnek çözüm

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

type Color = "red" | "green" | "blue";

function colorName(c: Color): string {
  switch (c) {
    case "red":
      return "Kırmızı";
    case "green":
      return "Yeşil";
    case "blue":
      return "Mavi";
    default:
      return assertNever(c);
  }
}

console.log(colorName("blue"));

Beklenen çıktı

Mavi

Soru ve cevaplar

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

1 Switch'i exhaustive yapmak için default dalında ne yapılır?

  • break kullanılır
  • return undefined yazılır
  • console.error yazılır
  • assertNever çağrısı yapılır Doğru cevap

Açıklama: default dalında assertNever(c) çağrısı yapılırsa, c never değilse (bir case eksikse) derleme hatası alınır; böylece switch exhaustive olur.

2 default dalında assertNever

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

type Color = "red" | "green" | "blue";

function colorName(c: Color): string {
  switch (c) {
    case "red": return "Kırmızı";
    case "green": return "Yeşil";
    case "blue": return "Mavi";
    default:
      return ____;
  }
}
Cevap
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

type Color = "red" | "green" | "blue";

function colorName(c: Color): string {
  switch (c) {
    case "red": return "Kırmızı";
    case "green": return "Yeşil";
    case "blue": return "Mavi";
    default:
      return assertNever(c);
  }
}

Açıklama: default dalında assertNever(c) çağrısı, c never değilse derleme hatası verir; bu sayede switch'in tüm üyeleri kapsadığı garanti edilir.

3 Switch exhaustive parçaları

Kavram Anlamı
default dalı tüm case'ler sonrası kalan
assertNever(c) c never değilse hata
Yeni üye ekleme eksik case'i derleyici yakalar
switch ifadesi tükenmiş olmalı

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