3. Jak działa Discriminating Union?

Discriminating Union jest właściwością TypeScripta pozwalającą na zmianę właściwości typu zależnie od wartości, z jakich składa się obiekt.

type WaterVehicle = { isWater: true, engines: number } type RoadVehicle = { isWater?: false, wheels: number } type Vehicle = { name: string } & (WaterVehicle | RoadVehicle) const car: Vehicle = {name: "Car"} //Property 'wheels' is missing in type '{ name: string; }' but required in type 'RoadVehicle'. const boat: Vehicle = {name: "Car", isWater: true} //Property 'engines' is missing in type '{ name: string; isWater: true; }' but required in type 'WaterVehicle'

W powyższym przykładzie obiekt car nie wymaga inicjalizacji pola engines, ponieważ nie wskazano wartości isWater. Jest ona domyślnie równa undefined, co spełnia warunek isWater?: (wartość opcjonalna). Typ Vehicle w tym przypadku wymaga pola wheels, a pole engines nie istnieje.. Ten sam efekt zostałby osiągnięty, gdyby wskazano wartość pola isWater jako false.

Jako, że obiekt boat posiada pole isWater jako true, górę bierze typ WaterVehicle, co sprawia, że pole engines jest wymagane a pole wheels nie istnieje.

Pole dyskryminujące nie musi być boleanem - może być dowolną inną wartością prymitywną lub enumem.

type WaterVehicle = { name: "Water", engines: number } type RoadVehicle = { name: "Road", wheels: number } type Vehicle = WaterVehicle | RoadVehicle;; const car: Vehicle = {name: "Road"} // Property 'wheels' is missing in type '{ name: "Road"; }' but required in type 'RoadVehicle'. const boat: Vehicle = {name: "Water"} // Property 'engines' is missing in type '{ name: "Water"; }' but required in type 'WaterVehicle'
devFlipCards 2024

Akceptujesz cookies?

Cookies to niewielkie fragmenty danych zapisywane lokalnie na twoim urządzeniu. Pomagają w funkcjonowaniu naszej strony - zapisują Twoje ustawienia strony takie jak motyw czy język. Poprawiają funkcjonowanie reklam i pozwalają nam na przeprowadzanie analityki odwiedzin strony. Korzystając ze strony zgadasz się na ich wykorzystanie.