TypeScript
Discriminated union nedir?
Etiketli union'ları öğrenirsin.
Discriminated union nedir?
Discriminated union, her üyenin ortak bir özelliğe (discriminant) sahip olduğu ve bu özelliğin her üyede farklı bir literal değer aldığı union türüdür. Ortak alan sayesinde TypeScript, bir koşulla union'ı tek bir üyeye daraltabilir. Bu, karmaşık veri modellerini güvenli şekilde işlemeyi sağlar.
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; size: number };
function area(s: Shape): number {
if (s.kind === "circle") {
return Math.PI * s.radius ** 2; // circle
}
return s.size ** 2; // square
}
Discriminant alanı
Discriminant alanı genellikle kind, type veya tag olarak adlandırılır. Her üye bu alana kendi benzersiz literal değerini verir; örneğin "circle", "square". Koşul bu literal değeri kontrol ettiğinde TypeScript union'ı o üyeye daraltır.
type Action =
| { type: "add"; item: string }
| { type: "remove"; id: number };
function run(a: Action) {
if (a.type === "add") {
a.item; // string
} else {
a.id; // number
}
}
Uygulama Discriminated union ile şekil alanı
Shape discriminated union türünü tanımla: "circle" (radius: number) ve "square" (size: number) üyeleri, kind discriminant alanıyla. area(s: Shape): number fonksiyonunu yaz. Eğer s.kind === "circle" ise Math.PI * s.radius ** 2 döndür; değilse s.size ** 2 döndür. console.log(area({ kind: "circle", radius: 2 })) ve console.log(area({ kind: "square", size: 3 })) ile sonuçları yazdır.
Örnek çözümü göster
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; size: number };
function area(s: Shape): number {
if (s.kind === "circle") {
return Math.PI * s.radius ** 2;
}
return s.size ** 2;
}
console.log(area({ kind: "circle", radius: 2 }));
console.log(area({ kind: "square", size: 3 }));
Kendini test et
-
Bir union'ın discriminated sayılması için ne gerekir?
- Tüm üyelerin aynı yapıda olması
- En az bir özelliğin opsiyonel olması
- Her üyenin bir sınıf olması
- Ortak bir özelliğin her üyede farklı literal değer alması
Cevabı göster
Ortak bir özelliğin her üyede farklı literal değer alması — Discriminated union için ortak bir discriminant alanı gerekir ve bu alan her üyede farklı bir literal değer alır; böylece TypeScript koşulla union'ı tek üyeye daraltabilir.
-
Discriminant alanı
type Shape =
| { kind: "circle"; radius: number }
| { kind: ____; size: number };
function area(s: Shape) {
if (s.kind === "square") return s.size ** 2;
return Math.PI * s.radius ** 2;
}
Cevabı göster
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; size: number };
function area(s: Shape) {
if (s.kind === "square") return s.size ** 2;
return Math.PI * s.radius ** 2;
}
-
Discriminated union parçaları
- Discriminant alanı
- her üyede farklı literal değer
- Ortak özellik
- tüm üyelerde bulunur
- Narrowing
- discriminant kontrolüyle yapılır
- Union
- üye türlerin birleşimi
Sıradaki ders: Literal discriminant