Pattern matching
- TypeScript kursu
- İleri seviye
- Ders 31/57
- 4 dk
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
// 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
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ı
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;
}
}
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 |