Type guard'lar
- TypeScript kursu
- İleri seviye
- Ders 51/57
- 5 dk
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.
Başlangıç kodu
// Node discriminated union türünü tanımla (kind: number, string, add)
// NumberNode ve StringNode türlerini tanımla
// isNumberNode ve isStringNode guard fonksiyonlarını yaz
// describe fonksiyonunu guard'larla yaz
// describe({ kind: "string", value: "x" }) sonucunu yazdırÖrnek çözüm
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" }));Beklenen çıktı
str:x
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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 Doğru cevap
Açıklama: 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.
2 isNumberNode predicate
function isNumberNode(n: Node): ____ {
return n.kind === "number";
}
function isNumberNode(n: Node): n is NumberNode {
return n.kind === "number";
}
Açıklama: n is NumberNode predicate'i, fonksiyon true döndürdüğünde n'in NumberNode olduğunu TypeScript'e söyler.
3 Type guard'lar parçaları
| Kavram | Anlamı |
|---|---|
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 |