TypeScript
never ile exhaustive
never ile tükenmişlik denetimini öğrenirsin.
never ile exhaustive
never türü, hiçbir değeri temsil etmeyen türedir. Bir switch ifadesinde tüm case'ler kapsandıktan sonra geriye kalan tür never olur. Bu özelliği kullanarak, eksik case varsa derleyici hatası alırız: never beklenen bir yere başka bir tür atanamaz.
function assertNever(x: never): never {
throw new Error("Unexpected: " + x);
}
type Shape = { kind: "circle"; radius: number } | { kind: "square"; size: number };
function area(s: Shape): number {
switch (s.kind) {
case "circle": return Math.PI * s.radius ** 2;
case "square": return s.size ** 2;
default: return assertNever(s);
}
}
never ve daraltma
switch tüm case'leri kapsadığında, default dalında union'ın kalan türü never olur. assertNever(s) çağrısı yalnızca s never olduğunda derler; eğer bir case eksikse, s never değildir ve derleme hatası alınır.
function assertNever(x: never): never {
throw new Error("Unexpected value");
}
function area(s: Shape): number {
switch (s.kind) {
case "circle": return Math.PI * s.radius ** 2;
case "square": return s.size ** 2;
default: return assertNever(s); // s: never
}
}
Uygulama assertNever ile exhaustive area
assertNever(x: never): never yardımcı fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). Shape discriminated union türünü tanımla: "circle" (radius: number), "square" (size: number) üyeleri. area(s: Shape): number fonksiyonunu switch (s.kind) ile yaz: circle için Math.PI * s.radius ** 2, square için s.size ** 2, default için return assertNever(s); yaz. console.log(area({ kind: "square", size: 4 })) ile sonucu yazdır.
Örnek çözümü göster
function assertNever(x: never): never {
throw new Error("Unexpected");
}
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; size: number };
function area(s: Shape): number {
switch (s.kind) {
case "circle":
return Math.PI * s.radius ** 2;
case "square":
return s.size ** 2;
default:
return assertNever(s);
}
}
console.log(area({ kind: "square", size: 4 }));
Kendini test et
-
never türü exhaustive check'te nasıl kullanılır?
- Switch case'lerini otomatik yazar
- Union üyelerini sayar
- Eksik case varsa default dalında never beklenen yere hata verir
- Çalışma zamanında değer kontrol eder
Cevabı göster
Eksik case varsa default dalında never beklenen yere hata verir — default dalında kalan tür tüm case'ler kapsandığında never olur; assertNever(x: never) çağrısı yalnızca never kabul eder, eksik case varsa derleme hatası verir.
-
assertNever imzası
function assertNever(x: ____): never {
throw new Error("Unexpected");
}
Cevabı göster
function assertNever(x: never): never {
throw new Error("Unexpected");
}
-
never ile exhaustive parçaları
- never türü
- hiçbir değeri temsil etmez
- default dalı
- tüm case'ler sonrası kalan tür
- assertNever(s)
- s never değilse hata verir
- Exhaustive check
- eksik case'i derleyici yakalar
Sıradaki ders: Switch exhaustive