Switch exhaustive
- TypeScript kursu
- İleri seviye
- Ders 34/57
- 4 dk
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
// 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
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
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 ____;
}
}
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ı |