El operador 'satisface' en TypeScript

Validar que el tipo de una expresión coincida con algún tipo, sin cambiar el tipo resultante de esa expresión

TypeScript 4.9 satisface

Con la versión 4.9, TypeScript introduce un nuevo operador llamado operador "satisface". Su propósito es hacer que los conjuntos de tipos no homogéneos sean más flexibles al permitir que una unión de tipos satisfaga el tipo general.

Corregir error de tipo con Record<>

El mejor ejemplo para demostrar este nuevo operador utiliza un tipo de "Registro", donde los tipos de valores pueden diferir.

type Keys = "alpha" | "beta" | "gamma";

const variants = {
  alpha: 0,
  beta: 1,
  gamma: "three"
} satisfies Record<Keys, string | number>;

// With the new 'satisfies'-operator,
// the types for each of the properties
// is correctly inferred.
const otherBeta = variants.beta + 10;
const gammeUppercase = variants.gamma.toUpperCase();

Como puede ver, el nuevo código permite inferir correctamente el tipo válido para la clave dada. Esto no sería posible antes de TypeScript 4.9. El compilador se quejaría de que el valor podría ser de tipo cadena o número, mientras que ahora el compilador infiere correctamente el tipo específico.

Restricción de nombre de propiedad

También podemos usar el operador new para indicarle al compilador que está bien que un conjunto solo incluya algunas claves dadas, pero no acepte ninguna otra.

type Keys = "alpha" | "beta" | "gamma";

const variants = {
    alpha: "value",
    beta: 0,
    // The compiler will show an error,
    // as 'delta' is not part of the keys.
    delta: new Date()
} satisfies Partial<Record<Keys, unknown>>;

Más ejemplos

Para obtener una lista completa de ejemplos con descripciones detalladas, recomiendo encarecidamente el número original de esta característica en Github, donde el autor describe muchos casos de uso (enlace también en el anexo).