tutorial online official nodejs example ejemplos convertir javascript typescript

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, la Date es, pero JQueryStatic no lo está)? Si no , definitivamente quieres la interface
  • ¿Estoy lidiando con una clase compilada de otro archivo TypeScript, o algo suficientemente similar? Si es así, use la declare class