Înainte de TypeScript 4.9, dezvoltatorii se confruntau mereu cu o dilemă atunci când doreau să verifice că un obiect respectă un anumit tip: fie adnotau explicit variabila cu tipul respectiv (dar pierdeau inferența literală exactă a proprietăților prin type widening), fie renunțau la adnotare pentru a păstra inferența specifică (dar riscau să scape proprietăți invalide sau scrise greșit). Operatorul satisfies rezolvă elegant această problemă.
Problema clasică vs. Soluția cu operatorul satisfies
type Culori = 'rosu' | 'verde' | 'albastru';
type CodCuloare = string | [number, number, number];
// METODA VECHE CU ADNOTARE:
const temaVeche: Record<Culori, CodCuloare> = {
rosu: '#ff0000',
verde: [0, 255, 0],
albastru: '#0000ff'
};
// PROBLEMA: temaVeche.rosu este de tip 'string | [number, number, number]'!
// temaVeche.rosu.toUpperCase(); // EROARE: Proprietatea toUpperCase nu există pe tuplu!
// NOU ÎN TYPESCRIPT 4.9+: OPERATORUL satisfies
const temaNoua = {
rosu: '#ff0000',
verde: [0, 255, 0],
albastru: '#0000ff'
} satisfies Record<Culori, CodCuloare>;
// AVANTAJ URIAȘ:
// 1. Verifică la compilare că toate cheile din Culori sunt prezente și valide!
// 2. Păstrează tipul exact: temaNoua.rosu este inferat ca 'string' (nu union),
// iar temaNoua.verde este inferat ca [number, number, number]!
console.log(temaNoua.rosu.toUpperCase()); // COMPLET VALID și auto-completat în IDE!
Diferențe Cheie între satisfies, Type Annotation și Type Assertion (as)
| Abordare | Sintaxă | Type Checking | Tipul Rezultat |
|---|---|---|---|
| Type Annotation | const x: T = ... |
Complet | Lărgit la T (pierde valorile literale concrete). |
| Type Assertion | const x = ... as T |
Periculos (forțează compilatorul să accepte forma). | Forțat la T (poate ascunde proprietăți lipsă sau erori la runtime). |
| Operatorul satisfies | const x = ... satisfies T |
Complet și riguros | Păstrează cel mai specific tip inferat posibil, garantând că respectă T. |
Detectarea proprietăților scrise greșit cu satisfies
type RuteAplicatie = Record<string, { cale: string; necesitaAutentificare: boolean }>;
const rute = {
acasa: { cale: '/', necesitaAutentificare: false },
profil: { cale: '/profil', necesitaAutentificare: true },
// Eroare prinsă instantaneu: proprietate necunoscută 'necesitaAuth'
setari: { cale: '/setari', necesitaAuth: true }
} satisfies RuteAplicatie;
// Type error: Object literal may only specify known properties, and 'necesitaAuth' does not exist in type '{ cale: string; necesitaAutentificare: boolean; }'.
Întrebări & Exemple de Cod:
Operatorul satisfies în TypeScript 4.9+ (Validare fără Pierderea Inferenței)Ai o nelămurire despre utilizarea comenzii
Operatorul satisfies în TypeScript 4.9+ (Validare fără Pierderea Inferenței)sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.