Özet - Exhaustive check
- TypeScript kursu
- İleri seviye
- Ders 36/57
- 4 dk
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
// 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
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
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);
}
}
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 |