Type Guards
Las guardias de tipo es el término en el que influyes en el análisis del
flujo de código a través del código. TypeScript utiliza el comportamiento
existente de JavaScript que valida sus objetos en tiempo de ejecución para
influir en el flujo de código. Este ejemplo asume que has leído
example:code-flow
Para repasar estos ejemplos, crearemos algunas clases, aquí hay un sistema
para manejar los pedidos por Internet o por teléfono.
// Podemos usar el operador "in" para verificar si una llave en particular está
en el objeto a deducir de la unión. ("in" es un operador de JavaScript para
probar las claves de los objetos.)
interface Order {
address: string;
}
interface TelephoneOrder extends Order {
callerNumber: string;
}
interface InternetOrder extends Order {
email: string;
}
// Entonces un tipo puede ser cualquiera de los dos subtipos de Order o undefined
type PossibleOrders = TelephoneOrder | InternetOrder | undefined;
// Y una función que retorna una posible orden `PossibleOrder`
declare function getOrder(): PossibleOrders;
const possibleOrder = getOrder();
// Puedes usar el operador "instanceof" de JavaScript si tienes una clase que se
ajusta a la interfaz:
if ("email" in possibleOrder) {
const mustBeInternetOrder = possibleOrder;
}
// Puedes usar el operador "typeof" para reducir la unión. Esto solo funciona
con las primitivas de JavaScript (como cadenas, objetos, números).
class TelephoneOrderClass {
address: string;
callerNumber: string;
}
if (possibleOrder instanceof TelephoneOrderClass) {
const mustBeTelephoneOrder = possibleOrder;
}
// Puede ver una lista completa de los posibles valores de typeof aquí:
https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/typeof
Usando los operadores de JavaScript sólo pueden llegar hasta aquí. Cuando
quieras comprobar tus propios tipos de objetos puedes usar las funciones de
predicado de tipos.
Una función de predicado de tipos es una función donde el tipo retornado
ofrece información al análisis del flujo de código cuando la función evaluada
es verdadera.
Usando el tipo PossibleOrders, podemos usar dos guardias de tipo para
declarar de que tipo es la orden:
if (typeof possibleOrder === "undefined") {
const definitelyNotAnOder = possibleOrder;
}
// Ahora podemos usar estas funciones en las declaraciones if para deducir el
tipo de la variable possibleOrder dentro del condicional if:
function isAnInternetOrder(order: PossibleOrders): order is InternetOrder {
return order && "email" in order;
}
function isATelephoneOrder(order: PossibleOrders): order is TelephoneOrder {
return order && "calledNumber" in order;
}
// Puedes leer más sobre el análisis del flujo de código aquí:
- example:code-flow
- example:type-guards
- example:discriminate-types
if (isAnInternetOrder(possibleOrder)) {
console.log("Order received via email:", possibleOrder.email);
}
if (isATelephoneOrder(possibleOrder)) {
console.log("Order received via phone:", possibleOrder.callerNumber);
}