javascript - online - ¿Cuál es la diferencia entre "declarar clase" e "interfaz" en TypeScript?
typescript tutorial pdf (3)
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, ¿entonces quizás no importe?
En términos simples, declare
se usa en archivos .ts
/ d.ts
para indicarle al compilador que deberíamos esperar que la palabra clave que estamos declaring
exista en ese entorno, incluso si no está definida en el presente archivo. Esto nos permitirá tener seguridad de tipo al usar el objeto declarado, ya que el compilador de Typescript ahora sabe que algún otro componente puede proporcionar esa variable.
Usted puede implementar la interfaz:
class MyClass implements Example {
Method() {
}
}
Mientras que la sintaxis de declare class
está destinada a ser utilizada para agregar definiciones de tipo para código externo que no está escrito en TypeScript, por lo que la implementación es "en otro lugar".
interface
es para cuando simplemente desea describir la forma de un objeto. No hay generación de código, nunca, para las interfaces: son solo un artefacto en el sistema de tipos. No verá diferencia en la generación de código para una clase según tenga o no una cláusula de implements
.
declare class
es para cuando desea describir una clase existente (generalmente una clase de TypeScript, pero no siempre) que va a estar externamente presente (por ejemplo, tiene dos archivos .ts que compilan en dos archivos .js y ambos están incluidos) a través de etiquetas de script
en una página web). Si hereda de una class
usa extends
(independientemente de si el tipo base fue una declare class
o una class
normal), el compilador generará todo el código para conectar la cadena de prototipos y los constructores de reenvío, y lo que no.
Si intenta heredar de una declare class
que debería haber sido una interfaz, tendrá un error de tiempo de ejecución porque ese código generado se referirá a un objeto sin manifestación de tiempo de ejecución.
Por el contrario, si simplemente implement
una interfaz que debería haber sido una declare class
, tendrá que volver a implementar a todos los miembros y no aprovechará la reutilización de código de la clase base aspirante. y las funciones que verifican la cadena de prototipos en el tiempo de ejecución rechazarán su objeto porque no es realmente una instancia de la clase base.
Para ser realmente nerd, si tienes un fondo de C ++, puedes pensar en la interface
como typedef
y declare class
como una declaración extern
de un constructor que carece estrictamente de una definición en esta unidad de compilación.
Desde un lado del consumo puro (escribir código imperativo, sin agregar nuevos tipos), la única diferencia entre la declare class
interface
y declare class
es que no se puede new
una new
interfaz. Sin embargo, si tiene la intención de extend
/ implement
uno de estos tipos en una nueva class
, es absolutamente necesario que haya elegido correctamente entre la interface
y declare class
. Solo uno de ellos funcionará.
Dos reglas que te servirán bien:
- ¿El nombre del tipo se está alineando con una función de constructor (algo invocable con
new
) que está realmente presente en el tiempo de ejecución (por ejemplo, laDate
es, peroJQueryStatic
no lo está)? Si no , definitivamente quieres lainterface
- ¿Estoy lidiando con una clase compilada de otro archivo TypeScript, o algo suficientemente similar? Si es así, use la
declare class