TypeScript
Type guard'lar
Her düğüm için type guard eklersin.
Düğüm için type guard
Her düğüm türü için bir type guard yazmak, dış kodun düğümü güvenli şekilde daraltmasını sağlar. isNumberNode(n: Node): n is NumberNode biçimindeki guard, true döndüğünde n'i NumberNode'ya daraltır.
type NumberNode = { kind: "number"; value: number };
function isNumberNode(n: Node): n is NumberNode {
return n.kind === "number";
}
Birden fazla guard
Birden fazla düğüm türü için guard yazmak, karmaşık dallanmayı temiz kılar. isNumberNode(n), isStringNode(n), isAddNode(n) guard'ları, switch yerine if zincirleriyle de daraltma yapabilir.
function isStringNode(n: Node): n is StringNode {
return n.kind === "string";
}
function isAddNode(n: Node): n is AddNode {
return n.kind === "add";
}
function process(n: Node): string {
if (isNumberNode(n)) return "num:" + n.value;
if (isStringNode(n)) return "str:" + n.value;
return "add";
}
Uygulama Düğüm type guard'ları yaz
Node discriminated union türünü tanımla ("number" (value: number), "string" (value: string), "add" (left: Node, right: Node)). NumberNode ve StringNode türlerini tanımla. isNumberNode(n: Node): n is NumberNode ve isStringNode(n: Node): n is StringNode guard fonksiyonlarını yaz (her biri n.kind === "..." ile kontrol yapsın). describe(n: Node): string fonksiyonunu yaz: eğer isNumberNode(n) true ise "num:" + n.value döndür; değilse eğer isStringNode(n) true ise "str:" + n.value döndür; değilse "add" döndür. console.log(describe({ kind: "string", value: "x" })) ile sonucu yazdır.
Örnek çözümü göster
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
type NumberNode = { kind: "number"; value: number };
type StringNode = { kind: "string"; value: string };
function isNumberNode(n: Node): n is NumberNode {
return n.kind === "number";
}
function isStringNode(n: Node): n is StringNode {
return n.kind === "string";
}
function describe(n: Node): string {
if (isNumberNode(n)) return "num:" + n.value;
if (isStringNode(n)) return "str:" + n.value;
return "add";
}
console.log(describe({ kind: "string", value: "x" }));
Kendini test et
-
Bir AST düğümü için type guard yazmanın faydası nedir?
- Kodu daha uzun yapar
- Çalışma zamanı hızını artırır
- Düğüm sayısını azaltır
- Dış kodun düğümü güvenli daraltmasını sağlar
Cevabı göster
Dış kodun düğümü güvenli daraltmasını sağlar — Type guard, dış kodun if koşulunda düğümü doğru türe daraltmasını sağlar; switch yerine if zinciriyle de temiz dallanma yapılabilir.
-
isNumberNode predicate
function isNumberNode(n: Node): ____ {
return n.kind === "number";
}
Cevabı göster
function isNumberNode(n: Node): n is NumberNode {
return n.kind === "number";
}
-
Type guard'lar parçaları
- isNumberNode(n)
- n NumberNode'ya daraltır
- n is NumberNode
- predicate dönüş türü
- n.kind === "number"
- çalışma zamanı kontrolü
- if (isNumberNode(n))
- if zinciriyle daraltma
Sıradaki ders: Exhaustive eval