Czy wiesz jak używać discriminated union w języku TypeScript?
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