interfacees para cuando simplemente desea describir la forma de un objeto. Nunca hay generación de código para las interfaces; son únicamente un artefacto en el sistema de tipos. No verá ninguna diferencia en la generación de código para una clase dependiendo de si tiene o no una implementscláusula.
declare classes para cuando desea describir una clase existente (generalmente una clase TypeScript, pero no siempre) que estará presente externamente (por ejemplo, tiene dos archivos .ts que se compilan en dos archivos .js y ambos se incluyen a través de scriptetiquetas en una página web). Si hereda de un classusing extends(independientemente de si el tipo base era declare classao regular class), el compilador generará todo el código para conectar la cadena de prototipos y los constructores de reenvío y demás.
Si intenta heredar de una declare classque debería haber sido una interfaz, tendrá un error de tiempo de ejecución porque el código generado se referirá a un objeto sin manifestación de tiempo de ejecución.
Por el contrario, si simplemente tiene implementuna interfaz que debería haber sido una declare class, tendrá que volver a implementar todos los miembros usted mismo y no aprovechará la reutilización de código de la clase base y las funciones posibles. que verifique la cadena de prototipos en tiempo de ejecución rechazará su objeto por no ser realmente una instancia de la clase base.
Para conseguir realmente nerd, si usted tiene un fondo ++ C, se puede pensar en más o menos interfacecomo typedefy declare classcomo una externdeclaración de un constructor que tiene falta de una definición estricta en esta unidad de compilación.
Desde el punto de vista del consumo puro (escribir código imperativo, no agregar nuevos tipos), la única diferencia entre interfacey declare classes que no puede tener newuna interfaz. Sin embargo, si tiene la intención de extend/ implementuno de estos tipos en un nuevo class, es absolutamente necesario que haya elegido correctamente entre interfacey declare class. Solo uno de ellos funcionará.
Dos reglas que te servirán bien:
- ¿El nombre del tipo se alinea con una función constructora (algo invocable con
new) que está realmente presente en tiempo de ejecución (por ejemplo Date, está, pero JQueryStaticno está)? Si no , definitivamente quieresinterface
- ¿Estoy tratando con una clase compilada de otro archivo TypeScript o algo suficientemente similar? Si sí , el uso
declare class