interface
é para quando você simplesmente deseja descrever a forma de um objeto. Não há geração de código, nunca, para interfaces - elas são apenas um artefato no sistema de tipos. Você não verá nenhuma diferença na geração de código para uma classe, dependendo se ela tem ou não uma implements
cláusula.
declare class
é para quando você deseja descrever uma classe existente (geralmente uma classe TypeScript, mas nem sempre) que estará presente externamente (por exemplo, você tem dois arquivos .ts que compilam para dois arquivos .js e ambos são incluídos por meio de script
tags em uma página da web). Se você herdar de um class
using extends
(independentemente de o tipo base ser a declare class
ou regular class
), o compilador irá gerar todo o código para conectar a cadeia de protótipos e os construtores de encaminhamento e quais não.
Se você tentar herdar de um declare class
que deveria ser uma interface, ocorrerá um erro de tempo de execução porque o código gerado estará se referindo a um objeto sem manifestação de tempo de execução.
Por outro lado, se você simplesmente implement
uma interface que deveria ser um declare class
, você terá que reimplementar todos os membros você mesmo e não tirará proveito de qualquer reutilização de código da suposta classe de base e funções que verificar a cadeia de protótipo em tempo de execução rejeitará seu objeto como não sendo realmente uma instância da classe base.
Para ficar realmente nerd, se você tem experiência em C ++, você pode pensar aproximadamente interface
como typedef
e declare class
como uma extern
declaração de um construtor que carece estritamente de uma definição nesta unidade de compilação.
Do ponto de vista do consumo puro (escrever código imperativo, não adicionar novos tipos), a única diferença entre interface
e declare class
é que você não pode usar new
uma interface. No entanto, se você pretende extend
/ implement
um desses tipos em um novo class
, é absolutamente necessário ter escolhido corretamente entreinterface
e declare class
. Apenas um deles funcionará.
Duas regras que lhe servirão bem:
- O nome do tipo está alinhado com uma função construtora (algo invocável
new
) que está realmente presente no tempo de execução (por exemplo Date
, está, mas JQueryStatic
não está)? Se não , você definitivamente querinterface
- Estou lidando com uma classe compilada de outro arquivo TypeScript ou algo suficientemente semelhante? Se sim , use
declare class