Distrito Telefónica. Hub de Innovación y Talento
Empecemos con 3x modelos de tipografía:
Definiciones de tipos en TypeScript
Resaltando las propiedades comunes de los tres tipos
type
en lugar de
interface
, podemos tratar este tema concreto en otro post. En resumen: prefiere
type
en lugar de
interface
para definir las propiedades de los objetos. Recuerda, se llama
Typescript
y no
InterfaceScript
ticketType
indica qué tipo está cumpliendo de las 3 opciones. Definimos su tipo como un
Tipo de unión.
type TicketType = 'event-ticket' | 'coupon' | 'pass';
type CommonTicket = {
ticketType: TicketType;
code: string;
description?: string;
}
type EventTicket = CommonTicket & {
ticketType: 'event-ticket';
event: {
eventId: string;
eventName: string;
eventDate: Date;
};
};
type Coupon = CommonTicket & {
ticketType: 'coupon';
discountAmount: number;
minPurchaseAmount?: number;
expirationDate?: Date;
};
type Pass = CommonTicket & {
ticketType: 'pass';
startDate: Date;
endDate: Date;
remainingUses?: number;
service: {
serviceId: string;
serviceName: string;
};
};
type Ticket = EventTicket | Coupon | Pass;
ifstatements
:
event-ticket
y
pass
, por lo que la input
Ticket
es un
Coupon
- VsCode infiere el tipo de
Coupon
correctamente:
Captura de pantalla de una función en la que primero comprobamos si hay un ticket de evento; el IDE infiere el tipado correcto.
¿Y si extraemos una función auxiliar?
Captura de pantalla con un error de typescript (explicado a continuación)
Property 'event' does not exist on type 'Ticket'
.
ticket
al extraer la comprobación de tipo a una función.
Predicados de tipo al rescate
-function isAnEvent(ticket: Ticket) {
+function isAnEvent(ticket: Ticket): ticket is EventTicket {
return ticket.ticketType === 'event-ticket';
}
isAnEvent()
no está devolviendo solo un booleano, ahora está definiendo el tipo de guarda que necesitamos.
isAnEvent()
[..] con alguna variable, TypeScript reducirá esa variable a ese tipo específico si el tipo original es compatible.
Sobrecarga
function getTicket(type: TicketType, code: string): Promise<Ticket> {
// when type is 'event-ticket' -> EventTicket
// when type is 'coupon' -> Coupon
// when type is 'pass' -> Pass
}
Nos gustaría decirle a Typescript,
getTicket();
Typescript inferirá el tipo exacto como un encanto:
Inferencia correcta de tipos