never ile exhaustive
- TypeScript kursu
- İleri seviye
- Ders 33/57
- 4 dk
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.
Başlangıç kodu
// assertNever fonksiyonunu tanımla (never parametre, never dönüş, throw içersin)
// Shape discriminated union türünü tanımla (kind: circle, square)
// area fonksiyonunu switch ile yaz, default'ta assertNever çağır
// square şeklinin alan sonucunu yazdırÖrnek çözüm
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 }));Beklenen çıktı
16
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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 Doğru cevap
- Çalışma zamanında değer kontrol eder
Açıklama: 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.
2 assertNever imzası
function assertNever(x: ____): never {
throw new Error("Unexpected");
}
function assertNever(x: never): never {
throw new Error("Unexpected");
}
Açıklama: assertNever parametre olarak never alır; bu, yalnızca tüm case'ler kapsandığında çağrılabileceği anlamına gelir, aksi halde derleme hatası verir.
3 never ile exhaustive parçaları
| Kavram | Anlamı |
|---|---|
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 |