TypeScript
Exhaustive eval
Exhaustive check ile değerlendirme fonksiyonu yazarsın.
Exhaustive eval
Değerlendirme fonksiyonu, tüm düğüm türlerini kapsayan bir switch ile yazılır. assertNever yardımcısı ile default dalı, eksik case varsa derleme hatası verir. Bu, yeni düğüm eklendiğinde tüm eval fonksiyonlarının güncellenmesini garanti eder.
function assertNever(x: never): never {
throw new Error("Unexpected: " + x);
}
function evalNode(n: Node): number | string {
switch (n.kind) {
case "number": return n.value;
case "string": return n.value;
case "add": return "(add)";
default: return assertNever(n);
}
}
assertNever ile güvenlik
assertNever ile default dalı, switch'in tüm durumları kapsadığını garanti eder. Yeni bir düğüm türü eklendiğinde, evalNode fonksiyonu artık tükenmiş değildir; default dalındaki n never olmaz ve assertNever(n) çağrısı derleme hatası verir.
function assertNever(x: never): never {
throw new Error("Unexpected");
}
function evalNode(n: Node): string {
switch (n.kind) {
case "number": return String(n.value);
case "string": return n.value;
case "add": return evalNode(n.left) + evalNode(n.right);
default: return assertNever(n);
}
}
Uygulama Exhaustive eval yaz
assertNever(x: never): never fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). Node discriminated union türünü tanımla ("number" (value: number), "string" (value: string), "add" (left: Node, right: Node)). evalNode(n: Node): string fonksiyonunu switch (n.kind) ile yaz: number için String(n.value), string için n.value, add için evalNode(n.left) + evalNode(n.right), default için return assertNever(n); yaz. console.log(evalNode({ kind: "add", left: { kind: "number", value: 1 }, right: { kind: "string", value: "x" } })) ile sonucu yazdır.
Örnek çözümü göster
function assertNever(x: never): never {
throw new Error("Unexpected");
}
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
function evalNode(n: Node): string {
switch (n.kind) {
case "number":
return String(n.value);
case "string":
return n.value;
case "add":
return evalNode(n.left) + evalNode(n.right);
default:
return assertNever(n);
}
}
console.log(evalNode({ kind: "add", left: { kind: "number", value: 1 }, right: { kind: "string", value: "x" } }));
Kendini test et
-
Exhaustive eval fonksiyonunda assertNever ne sağlar?
- Çalışma zamanı hatası
- Yeni düğüm eklendiğinde eksik case'i derleyici bildirir
- Otomatik case ekleme
- Daha hızlı yürütme
Cevabı göster
Yeni düğüm eklendiğinde eksik case'i derleyici bildirir — assertNever ile default dalı, switch'in tüm durumları kapsadığını garanti eder; yeni düğüm eklenince eksik case'ler derleme hatası verir.
-
assertNever default dalında
function assertNever(x: never): never {
throw new Error("Unexpected");
}
function evalNode(n: Node): string {
switch (n.kind) {
case "number": return String(n.value);
case "string": return n.value;
case "add": return evalNode(n.left) + evalNode(n.right);
default:
return ____;
}
}
Cevabı göster
function assertNever(x: never): never {
throw new Error("Unexpected");
}
function evalNode(n: Node): string {
switch (n.kind) {
case "number": return String(n.value);
case "string": return n.value;
case "add": return evalNode(n.left) + evalNode(n.right);
default:
return assertNever(n);
}
}
-
Exhaustive eval parçaları
- assertNever(n)
- n never değilse hata
- default dalı
- tüm case'ler sonrası kalan
- Yeni düğüm eklenince
- eksik case derleyicide hata
- switch (n.kind)
- tüm düğüm türlerini kapsar
Sıradaki ders: Birleştirme