angularjs - Care este scopul utilizării interfețelor TypeScript pentru serviciile Angular pentru informații de tip
Care sunt avantajele creării unei interfețe pentru un serviciu Angular comparativ cu exportarea clasei serviciului și folosirea acesteia pentru informații de tip în schimb?
Exemplu :
class Dashboard {
constructor(ui: IUiService){}
}
vs
class Dashboard {
constructor(ui: UiService){}
}
Există un beneficiu de performanță? Ce se întâmplă dacă folosesc doar clasa de serviciu pentru informații despre tip?
Se pare a fi lucru suplimentar fără beneficiu, cu excepția cazului în care ai implementări diferite ale unui serviciu care pot fi folosite, dar au o bază comună. Sau atunci când vrei să falsifici serviciile în teste unitare în loc să le folosești direct.
Edit: Sunt curios să știu ce va face compilatorul TypeScript pentru importurile care sunt folosite doar pentru informații despre tip. Va invoca un constructor sau va adăuga la declarația require (ES6)? Ar crea o instanță a clasei?
Răspuns #1
Aceasta nu este o întrebare despre TypeScript, aceasta este o întrebare de genul „La ce sunt bune interfețele” (pe scurt). Răspunsul este: Un client nu ar trebui să „știe” care este implementarea reală a unui serviciu solicitat. Serviciul tău UiService de astăzi este suficient pentru nevoile tale, dar într-o zi ai putea avea o altă implementare pentru el, sau chiar ai dori să-l simulezi în testele tale.
Un alt caz ar fi acela în care UiService a fost extins de ProUiService în întregul tău sistem, va trebui să mergi prin tot sistemul tău și să schimbi tipul injecțiilor tale, deși nu este cu adevărat necesar.
Așa cum s-a spus înainte: Un client nu ar trebui să știe care este implementarea reală a unui serviciu solicitat.
Editează (Răspunzând la editare):
Compilatorul TypeScript nu va „ști” unde să preia aceste tipuri Class/Interface; va trebui să folosești tsconfig.json sau o referință (comentariu) în codul tău pentru a permite TypeScript să înțeleagă unde este definită această declarație. Nu contează dacă este un tip al unei clase.
Este important să înțelegi că atunci când imporți (stil ES6) o clasă și nu o folosești cu adevărat (o folosești doar ca definiție de tip), aceasta va fi eliminată de compilator, deoarece tipurile nu există cu adevărat în JavaScript. DAR, dacă o folosești. De exemplu:
var ui = new UiService(); // This will generate a javascript code
Compilatorul nu va elimina instrucțiunea de import.
Răspunsul #2
...decât dacă aveți implementări diferite ale unui serviciu care pot fi utilizate, dar care au o bază comună. Sau atunci când doriți să imitați serviciile în testele unitare în loc să le folosiți direct.
Exact asta este motivul. Nu există niciun beneficiu de performanță în utilizarea interfețelor deoarece interfețele nu apar în JavaScript-ul transpilat.
Poți folosi clasa serviciului pentru informații despre tip dacă vrei și asta este ceea ce se face în Ghidul pas cu pas Angular—vezi Creează o clasă pentru proprietatea de tip array și injectează-o în componentă.
