O interfață este o formă a unui obiect. Un obiect JavaScript standard este o hartă de perechi key:value. Cheile obiectelor JavaScript sunt, în aproape toate cazurile, șiruri de caractere, iar valorile lor sunt orice valori JavaScript acceptate (primitive sau abstracte).
O interfață îi spune compilatorului TypeScript despre numele proprietăților pe care le poate avea un obiect și tipurile de valori corespunzătoare acestora. Prin urmare, interfața este un tip și este un tip abstract, deoarece este compusă din tipuri primitive.
Când definim un obiect cu proprietăți (chei) și valori, TypeScript creează o interfață implicită uitându-se la numele proprietăților și la tipul de date al valorilor lor din obiect. Acest lucru se întâmplă din cauza inferenței de tip.
În exemplul de mai sus, am creat un obiect student cu câmpurile firstName, lastName, age și getSalary și i-am atribuit niște valori inițiale. Folosind aceste informații, TypeScript creează un tip de interfață implicită pentru student.
O interfață este la fel ca un obiect, dar conține doar informații despre proprietățile obiectului și tipurile acestora. Putem, de asemenea, să creăm un tip de interfață și să îi dăm un nume, astfel încât să o putem folosi pentru a adnota valorile obiectului, dar aici, această interfață nu are un nume, deoarece a fost creată implicit. Puteți compara acest lucru cu tipul de funcție din lecția anterioară, care a fost creat implicit la început și apoi am creat un tip de funcție în mod explicit folosind aliasul de tip.
Să încercăm să ne jucăm cu proprietățile obiectului după ce a fost definit.
După cum puteți vedea din exemplul de mai sus, TypeScript își amintește forma unui obiect deoarece tipul de ross este interfața implicită. Dacă încercăm să suprascriem valoarea unei proprietăți cu o valoare de alt tip decât cel specificat în interfață sau încercăm să adăugăm o nouă proprietate care nu este specificată în interfață, compilatorul TypeScript nu va compila programul.
Dacă doriți ca un obiect să aibă practic orice proprietate, atunci puteți marca explicit o valoare any și compilatorul TypeScript nu va deduce tipul din valoarea atribuită obiectului. Există și alte modalități mai bune de a realiza exact acest lucru și le vom trece în revistă în acest articol.
Deși interfața implicită pe care am văzut-o până acum este, din punct de vedere tehnic, un tip, dar nu a fost definită explicit. După cum s-a discutat, o interfață nu este altceva decât forma pe care o poate lua un obiect. Dacă avem o funcție care acceptă un argument care ar trebui să fie un obiect, dar de o anumită formă, atunci trebuie să notăm acel argument (parametru) cu un tip de interfață.
În exemplul de mai sus, am definit o funcție getPersonInfo care acceptă un argument obiect care are câmpurile firstName, lastName, age și getSalary de tipuri de date specificate. Observați că am folosit un obiect care conține nume de proprietăți și tipurile corespunzătoare acestora ca tip folosind adnotarea :<type>. Acesta este un exemplu de interfață anonimă, deoarece interfața nu are un nume, a fost folosită inline.
Toate acestea par puțin complicate de gestionat. Dacă obiectul ross devine mai complicat și trebuie să fie folosit în mai multe locuri, TypeScript pare doar un lucru care v-a plăcut inițial, dar care acum este doar un lucru greu de gestionat. Pentru a rezolva această problemă, definim un tip de interfață folosind cuvântul cheie interface.
În exemplul de mai sus, am definit o interfață Person care descrie forma unui obiect, dar de data aceasta, avem un nume pe care îl putem folosi pentru a ne referi la acest tip. Am folosit acest tip pentru a adnota variabila ross, precum și argumentul person al funcției getPersonIfo. Acest lucru va informa TypeScript să valideze aceste entități în funcție de forma Person.
De ce să folosim o interfață?
Tipul de interfață poate fi important pentru a impune o anumită formă. De obicei, în JavaScript, ne punem o încredere oarbă în timpul execuției că un obiect va conține întotdeauna o anumită proprietate și că acea proprietate va avea întotdeauna o valoare de un anumit tip, cum ar fi {age: 21, ...} ca exemplu.
Când începem efectiv să efectuăm operații asupra acelei proprietăți fără a verifica mai întâi dacă acea proprietate există pe obiect sau dacă valoarea ei este cea pe care o așteptam, lucrurile pot merge prost și vă poate lăsa aplicația inutilizabilă după aceea. De exemplu, {age: '21', ...}, aici age valoarea age este un string.
Interfețele oferă un mecanism sigur pentru a face față unor astfel de scenarii în momentul compilării. Dacă utilizați din greșeală o proprietate pe un obiect care nu există sau folosiți valoarea unei proprietăți într-o operațiune ilegală, compilatorul TypeScript nu vă va compila programul. Să vedem un exemplu.