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
satisfiescând vrei ca variabila să aibă chiar tipul mai larg (de exemplu ca să adaugi mai târziu chei noi). Atunci adnotarea: Tipeste alegerea corectă. - Confunzi
satisfiescuas.aspoate ascunde erori;satisfiesdoar 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.