En TypeScript, al crear archivos de declaración de origen .d.ts, ¿cuál es preferible y por qué?
declare class Example {
public Method(): void;
}
o
interface Example {
Method(): void;
}
Las diferencias que puedo decir son que las interfaces no pueden tener métodos estáticos, por lo que debe usar una clase para eso. Ambos no producen ninguna salida JS, por lo que quizás no importe.
javascript
typescript
Chris
fuente
fuente

Respuestas:
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 unaimplementsclá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 descriptetiquetas en una página web). Si hereda de unclassusingextends(independientemente de si el tipo base eradeclare classao regularclass), 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 unadeclare 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
interfacecomotypedefydeclare classcomo unaexterndeclaració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
interfaceydeclare classes que no puede tenernewuna interfaz. Sin embargo, si tiene la intención deextend/implementuno de estos tipos en un nuevoclass, es absolutamente necesario que haya elegido correctamente entreinterfaceydeclare class. Solo uno de ellos funcionará.Dos reglas que te servirán bien:
new) que está realmente presente en tiempo de ejecución (por ejemploDate, está, peroJQueryStaticno está)? Si no , definitivamente quieresinterfacedeclare classfuente
newoperador en un tipo de interfaz. Sin embargo, las interfaces pueden tener firmas de construcción, lo que significa que puede invocar alnewoperador en un valor del tipo de interfaz. Esto es muy diferente de cómoclassfunciona, donde la firma de construcción está en el nombre del tipo en sí en lugar de en una expresión de ese tipo.Puede implementar la interfaz:
Mientras que la
declare classsintaxis está realmente pensada para ser utilizada para agregar definiciones de tipo para código externo que no está escrito en TypeScript, la implementación está "en otra parte".fuente
En términos simples,
declarese usa en.ts/d.tsfiles para decirle al compilador que debemos esperar que la palabra clave wedeclaringexista en ese entorno, incluso si no está definida en el archivo actual. Esto nos permitirá tener seguridad de tipos cuando usemos el objeto declarado, ya que el compilador de TypeScript ahora sabe que algún otro componente puede proporcionar esa variable.fuente
Diferencia entre
declareyinterfaceen TS:declarar:
En el código anterior,
declareel compilador de TS sabe que en algún lugarExamplese declara la clase . Esto no significa que la clase esté incluida mágicamente. Tú, como programador, eres responsable de tener la clase disponible cuando la declaras (con ladeclarepalabra clave).interfaz:
An
interfacees una construcción virtual que solo existe dentro de mecanografiado. El compilador de mecanografiado lo usa con el único propósito de verificar el tipo. Cuando el código se compila en JavaScript, toda esta construcción se eliminará. El compilador de mecanografiado utiliza interfaces para comprobar si los objetos tienen la estructura correcta.Por ejemplo cuando tenemos la siguiente interfaz:
Los objetos que definimos que tienen este tipo de interfaz deben coincidir exactamente con la interfaz:
fuente