interface
è per quando si desidera semplicemente descrivere la forma di un oggetto. Non esiste la generazione di codice, mai, per le interfacce: sono solo un artefatto nel sistema dei tipi. Non vedrai alcuna differenza nella generazione del codice per una classe a seconda che abbia o meno una clausola implements
.
declare class
è per quando si vuole descrivere un esistente classe (di solito una classe dattiloscritto, ma non sempre) che sta per essere esternamente presente (ad esempio, si dispone di due file .ts che compilano a due .js i file e entrambi sono inclusi tramite i tag script
in una pagina Web). Se si eredita da extends
utilizzando (indipendentemente dal fatto che il tipo di base fosse un declare class
o un 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 declare class
che avrebbe dovuto essere un'interfaccia, si verificherà un errore di runtime poiché il codice generato si riferirà a un oggetto senza manifestazione di runtime.
Viceversa, se si semplicemente implement
un'interfaccia che avrebbe dovuto essere un declare class
, sarà necessario reimplementare tutti i membri da soli e non si avvarrà di alcun riutilizzo del codice da parte del- essere la classe base e le funzioni che controllano la catena del prototipo durante il runtime rigetteranno il tuo oggetto come se non fosse un'istanza della classe base.
Per ottenere davvero nerd, se si dispone di uno sfondo C++, si può pensare a circa interface
come typedef
e declare class
come extern
dichiarazione di un costruttore che manca una definizione strettamente in questa unità di compilazione.
Da un lato puramente di consumo (scrittura del codice imperativo, non aggiungendo nuovi tipi), l'unica differenza tra interface
e declare class
è che non è possibile un'interfaccia new
. Tuttavia, se si intende extend
/implement
uno di questi tipi in un nuovo class
, è assolutamente necessario aver scelto correttamente tra interface
e declare class
. Solo uno di loro funzionerà.
Due regole che vi servirà bene:
- è il nome del tipo di allineamento con una funzione di costruzione (qualcosa richiamabile con
new
) che è effettivamente presente in fase di esecuzione (ad esempio Date
è, ma JQueryStatic
non è) ? Se no, si desidera sicuramente interface
- Mi occupo di una classe compilata da un altro file TypeScript o qualcosa di abbastanza simile? Se si, utilizzare
declare class
fonte
2013-01-15 22:27:16
Vedere http://stackoverflow.com/a/14323673/1704166 –
Non penso che nessuno di questi aiuti possa descrivere che usereste uno su un altro poiché entrambi possono ottenere la stessa cosa senza output JS. – Chris