postimage

Discriminated union (pol. unia dyskryminacyjna) to połączenie takich typów, z których każdy posiada jedno wspólne pole, na podstawie którego możemy określić, z jakim z nich mamy do czynienia. Zgodnie z ogólnie przyjętą konwencją jest to pole type, które jest typu Literal Type, czyli jego typ opisuje się za pomocą stringa.

Zdefiniujmy unię dyskryminacyjną oraz funkcję anonimową przypisaną do getPrice, która rozpoznaje jej typ i wykonuje zależny od niego kod:

type Invoice = {
  type: 'INVOICE',
  number: string,
  date: Date
  positions: {
    name: string
    price: number
    quantity: number
  }[],
   
}
 
type Bill = {
  type: 'BILL',
  date: Date,
  totalPrice: number
}
 
type CompanyPurchase = Invoice | Bill;
 
const getPrice = (purchase: CompanyPurchase): number => {
  switch(purchase.type) {
    case 'INVOICE':
      return purchase.positions.reduce((acc, item) => acc + item.price * item.quantity, 0);
    case 'BILL':
      return purchase.totalPrice;
    default:
      return 0;
  }
}

Typy Invoice oraz Bill mają wspólne pole type. Dzięki zastosowaniu unii dyskryminacyjnej TypeScript sam rozpoznaje konkretny typ parametru purchase w funkcji anonimowej przypisanej do zmiennej getPrice, rzutowania są zbędne.

Przykład działania: https://www.typescriptlang.org/play#code/C(…)A

💡 "Czy wiesz, że?" to wewnątrzfirmowa inicjatywa, której celem jest szerzenie ciekawostek z różnych obszarów IT. Najlepsze z nich trafiają na bloga dla szerszego grona odbiorców.