CodeBlanks Logo Icon CodeBlanks

Pattern matching

Discriminated union'larla dallanmayı öğrenirsin.

Pattern matching

Discriminated union'lar switch ifadesiyle işlenir; her case, discriminant değerine göre bir üyeye daraltır. Bu yöntem pattern matching olarak adlandırılır. Tüm üyeleri kapsayan case'ler yazıldığında TypeScript, eksik bir case varsa uyarır.

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;
  }
}

Exhaustiveness kontrolü

switch ifadesinde tüm üyeleri kapsayan case'ler yazılırsa, TypeScript eksik case varsa uyarır. default dalı eklemek yerine tüm case'leri yazmak daha güvenlidir; yeni üye eklendiğinde derleyici nerede case eksik olduğunu gösterir.

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;
  }
}

Uygulama switch ile şekil alanı

Shape discriminated union türünü tanımla: "circle" (radius: number), "square" (size: number), "rectangle" (width: number, height: number) üyeleri, kind discriminant alanıyla. area(s: Shape): number fonksiyonunu switch (s.kind) ile yaz. circle için Math.PI * s.radius ** 2, square için s.size ** 2, rectangle için s.width * s.height döndür. console.log(area({ kind: "rectangle", width: 4, height: 5 })) ile sonucu yazdır.

Başlangıç kodu

index.ts
// Shape discriminated union türünü tanımla (kind discriminant, circle, square, rectangle üyeleri)

// area fonksiyonunu discriminant kontrolüyle switch ile yaz

// rectangle şeklinin alan sonucunu yazdır

Örnek çözüm

index.ts
type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; size: number }
  | { kind: "rectangle"; width: number; height: number };

function area(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius ** 2;
    case "square":
      return s.size ** 2;
    case "rectangle":
      return s.width * s.height;
  }
}

console.log(area({ kind: "rectangle", width: 4, height: 5 }));

Beklenen çıktı

20

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Discriminated union'ı işlemek için en uygun yapı hangisidir?

  • try/catch
  • for döngüsü
  • while döngüsü
  • switch ifadesi Doğru cevap

Açıklama: switch ifadesi, discriminant değerine göre her üyeye daraltır; her case bir üyeye karşılık gelir ve pattern matching sağlar.

2 switch case daraltması

Soru
type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; size: number };

function area(s: Shape): number {
  switch (s.kind) {
    case ____:
      return Math.PI * s.radius ** 2;
    case "square":
      return s.size ** 2;
  }
}
Cevap
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;
  }
}

Açıklama: switch case "circle", Shape union'ının circle üyesine daraltır; case gövdesinde s.radius güvenle kullanılır.

3 Pattern matching parçaları

Kavram Anlamı
switch ifadesi discriminant'a göre dallanma
case "circle" circle üyesine daraltır
Exhaustiveness check eksik case'i uyarır
default dalı tüm üyeleri kapsamazsa kullanılır

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