CodeBlanks Logo Icon CodeBlanks

Özet - Exhaustive check

Exhaustive check ile güvenli bir durum yöneticisi yazarsın.

Özet - Exhaustive check

Exhaustive check, union üyelerini işleyen switch'lerin tamamının tükenmiş olmasını garanti eder. assertNever ile default dalı never parametresi alır; eksik case varsa derleyici hatası verir. Bu, durum yöneticilerinde yeni durum eklenince tüm işleme yerlerinin güncellenmesini zorlar.

type State = "idle" | "loading" | "ready" | "error";

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

function transition(s: State): string {
  switch (s) {
    case "idle": return "Başlat";
    case "loading": return "Yükleniyor";
    case "ready": return "Hazır";
    case "error": return "Hata";
    default: return assertNever(s);
  }
}

Uygulama Durum yöneticisi yaz

assertNever(x: never): never fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). State = "idle" | "loading" | "ready" | "error" union türünü tanımla. transition(s: State): string fonksiyonunu switch (s) ile yaz: idle için "Başlat", loading için "Yükleniyor", ready için "Hazır", error için "Hata", default için return assertNever(s); yaz. console.log(transition("ready")) ve console.log(transition("error")) ile sonuçları yazdır.

Başlangıç kodu

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

// State union türünü tanımla (idle, loading, ready, error)

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

// "ready" ve "error" durumlarının sonuçlarını yazdır

Örnek çözüm

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

type State = "idle" | "loading" | "ready" | "error";

function transition(s: State): string {
  switch (s) {
    case "idle":
      return "Başlat";
    case "loading":
      return "Yükleniyor";
    case "ready":
      return "Hazır";
    case "error":
      return "Hata";
    default:
      return assertNever(s);
  }
}

console.log(transition("ready"));
console.log(transition("error"));

Beklenen çıktı

Hazır
Hata

Soru ve cevaplar

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

1 Bir durum yöneticisinde yeni bir durum eklenirse ne olur?

  • Mevcut case'ler silinir
  • Tüm switch'lerdeki eksik case'ler derleyici hatası verir Doğru cevap
  • assertNever otomatik çağrılır
  • Çalışma zamanı hatası alınır

Açıklama: Yeni durum 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 güncellenecek yerleri bildirir.

2 error durumunu işle

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

type State = "idle" | "loading" | "ready" | "error";

function transition(s: State): string {
  switch (s) {
    case "idle": return "Başlat";
    case "loading": return "Yükleniyor";
    case "ready": return "Hazır";
    case ____: return "Hata";
    default: return assertNever(s);
  }
}
Cevap
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

type State = "idle" | "loading" | "ready" | "error";

function transition(s: State): string {
  switch (s) {
    case "idle": return "Başlat";
    case "loading": return "Yükleniyor";
    case "ready": return "Hazır";
    case "error": return "Hata";
    default: return assertNever(s);
  }
}

Açıklama: case "error", State union'ının error üyesine daraltır; bu durumun da işlenmesi exhaustive check için gereklidir.

3 Exhaustive check özet eşleştirmesi

Kavram Anlamı
assertNever(x: never) parametresi never olmalı
default dalı tüm case'ler sonrası kalan
Yeni durum eklenince eksik case derleyicide hata
Derleme zamanı güvenliği çalışma zamanı hatasını önler

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