interfaceserve per descrivere semplicemente la forma di un oggetto. Non c'è mai nessuna generazione di codice per le interfacce: sono solo un artefatto nel sistema di tipi. Non vedrai alcuna differenza nella generazione del codice per una classe a seconda che abbia o meno una implementsclausola.
declare classserve quando vuoi descrivere una classe esistente (di solito una classe TypeScript, ma non sempre) che sarà presente esternamente (ad esempio, hai due file .ts che si compilano in due file .js ed entrambi sono inclusi tramite scripttag in una pagina web). Se erediti da un classusing extends(indipendentemente dal fatto che il tipo di base fosse a declare classo normale class) il compilatore genererà tutto il codice per collegare la catena di prototipi e i costruttori di inoltro e cosa no.
Se si tenta di ereditare da un'interfaccia declare classche avrebbe dovuto essere, si verificherà un errore di runtime perché il codice generato farà riferimento a un oggetto senza manifestazione di runtime.
Al contrario, se hai semplicemente implementun'interfaccia che avrebbe dovuto essere a declare class, dovrai reimplementare tutti i membri da solo e non trarrai vantaggio dal riutilizzo del codice dalla potenziale classe base e dalle funzioni che controlla la catena del prototipo in fase di esecuzione rifiuterà il tuo oggetto in quanto non è effettivamente un'istanza della classe base.
Per diventare davvero nerd, se hai uno sfondo C ++, puoi pensare interfacepiù typedefo meno declare classcome e come una externdichiarazione di un costruttore a cui manca rigorosamente una definizione in questa unità di compilazione.
Dal punto di vista del consumo puro (scrivere codice imperativo, non aggiungere nuovi tipi), l'unica differenza tra interfacee declare classè che non puoi newun'interfaccia. Tuttavia, se intendi extend/ implementuno di questi tipi in un nuovo class, devi assolutamente aver scelto correttamente tra interfacee declare class. Solo uno di loro funzionerà.
Due regole che ti serviranno bene:
- Il nome del tipo si allinea con una funzione di costruzione (qualcosa invocabile con
new) che è effettivamente presente in fase di esecuzione (ad esempio Dateè, ma JQueryStaticnon lo è)? Se no , lo vuoi sicuramenteinterface
- Ho a che fare con una classe compilata da un altro file TypeScript o qualcosa di sufficientemente simile? Se sì , usa
declare class