satisfies în TypeScript

Verifică dacă o valoare se potrivește cu un tip, dar păstrează tipul ei exact, mai precis decât Tip.

Sintaxă
const x = valoare satisfies Tip;

Ce face satisfies

valoare satisfies Tip verifică la compilare că valoarea respectă tipul: proprietăți lipsă, proprietăți în plus sau tipuri greșite sunt erori, ca la o adnotare. Diferența: variabila nu primește tipul Tip, ci păstrează tipul dedus din valoare, care este mai precis.

Cu o adnotare, const culori: Record<string, string | number[]> = {...}, pierzi informația: culori.rosu poate fi oricare dintre variante și nici nu știi ce chei există. Cu satisfies, TypeScript știe că culori.rosu este exact number[] și ce chei are obiectul, iar verificarea față de Record se face în continuare.

Spre deosebire de as, satisfies nu oprește nicio verificare, deci este sigur. Se combină des cu as const: {...} as const satisfies Tip.

Exemple

Exemplul 1: Verificare fără pierderea tipului exact

paleta.rosu este cunoscut ca tablou, deci are map; paleta.albastru este text, deci are toUpperCase.

type Culoare = string | [number, number, number];

const paleta = {
    rosu: [255, 0, 0],
    verde: "#00ff00",
    albastru: "blue",
} satisfies Record<string, Culoare>;

console.log(paleta.rosu.map((c) => c.toString(16).padStart(2, "0")).join(""));
console.log(paleta.albastru.toUpperCase());
console.log(Object.keys(paleta));

Rezultat

ff0000
BLUE
[ 'rosu', 'verde', 'albastru' ]

Exemplul 2: Greșelile sunt totuși prinse

Un tablou cu două elemente nu este un Culoare.

type Culoare = string | [number, number, number];
const paleta = {
    rosu: [255, 0],
    verde: "#00ff00",
} satisfies Record<string, Culoare>;
console.log(paleta);

Eroarea afișată de tsc

exemplu.mts(3,5): error TS2322: Type '[number, number]' is not assignable to type 'Culoare'.
  Type '[number, number]' is not assignable to type '[number, number, number]'.
    Source has 2 element(s) but target requires 3.

Exemplul 3: Configurare cu chei verificate

satisfies cere ca fiecare oraș din Oras să aibă o valoare, iar tipul rezultat păstrează valorile exacte.

type Oras = "Iași" | "Cluj" | "Timișoara";

const coduriPostale = {
    "Iași": "700000",
    "Cluj": "400000",
    "Timișoara": "300000",
} as const satisfies Record<Oras, string>;

const cod: "700000" = coduriPostale["Iași"];
console.log(cod, Object.entries(coduriPostale).length);

Rezultat

700000 3

Greșeli frecvente

  • Folosești satisfies când vrei ca variabila să aibă chiar tipul mai larg (de exemplu ca să adaugi mai târziu chei noi). Atunci adnotarea : Tip este alegerea corectă.
  • Confunzi satisfies cu as. as poate ascunde erori; satisfies doar verifică.

Comenzi înrudite

  • as const: Face un literal complet readonly și păstrează valorile exacte ca tipuri: „Iași” în loc de string.
  • as (type assertion): Îi spui compilatorului ce tip are o valoare, când știi mai mult decât el; nu face nicio conversie la rulare.
  • Record: Record<K, T> descrie un obiect ale cărui chei sunt K și ale cărui valori au toate tipul T.
  • inferența tipurilor: TypeScript deduce singur tipul variabilelor și al rezultatelor din valorile pe care le scrii, fără adnotări.