TypeScript
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.
Örnek çözümü göster
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"));
Kendini test et
-
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
Cevabı göster
assertNever çağrısı yapılır — 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.
-
default dalında assertNever
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 ____;
}
}
Cevabı göster
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);
}
}
-
Switch exhaustive parçaları
- 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ı
Sıradaki ders: Compile-time güvenlik