TypeScript
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.
Örnek çözümü göster
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 }));
Kendini test et
-
Discriminated union'ı işlemek için en uygun yapı hangisidir?
- try/catch
- for döngüsü
- while döngüsü
- switch ifadesi
Cevabı göster
switch ifadesi — switch ifadesi, discriminant değerine göre her üyeye daraltır; her case bir üyeye karşılık gelir ve pattern matching sağlar.
-
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;
}
}
Cevabı göster
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;
}
}
-
Pattern matching parçaları
- 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
Sıradaki ders: Özet - Discriminated unions