CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

index.ts
// 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

index.ts
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

Soru
function isNumberNode(n: Node): ____ {
  return n.kind === "number";
}
Cevap
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

İleri seviye bölümündeki tüm dersler