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:
interface
es 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 unaimplements
cláusula.declare class
es 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 descript
etiquetas en una página web). Si hereda de unclass
usingextends
(independientemente de si el tipo base eradeclare class
ao 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 class
que 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
implement
una 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
interface
comotypedef
ydeclare class
como unaextern
declaració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
interface
ydeclare class
es que no puede tenernew
una interfaz. Sin embargo, si tiene la intención deextend
/implement
uno de estos tipos en un nuevoclass
, es absolutamente necesario que haya elegido correctamente entreinterface
ydeclare 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á, peroJQueryStatic
no está)? Si no , definitivamente quieresinterface
declare class
fuente
new
operador en un tipo de interfaz. Sin embargo, las interfaces pueden tener firmas de construcción, lo que significa que puede invocar alnew
operador en un valor del tipo de interfaz. Esto es muy diferente de cómoclass
funciona, 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 class
sintaxis 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,
declare
se usa en.ts
/d.ts
files para decirle al compilador que debemos esperar que la palabra clave wedeclaring
exista 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
declare
yinterface
en TS:declarar:
En el código anterior,
declare
el compilador de TS sabe que en algún lugarExample
se 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 ladeclare
palabra clave).interfaz:
An
interface
es 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