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 implementsclá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 scripttags em uma página da web). Se você herdar de um classusing extends(independentemente de o tipo base ser a declare classou 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 classque 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 implementuma 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 interfacecomo typedefe declare classcomo uma externdeclaraçã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 interfacee declare classé que você não pode usar newuma interface. No entanto, se você pretende extend/ implementum 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 JQueryStaticnã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