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'