No TypeScript, ao criar arquivos de declaração de origem .d.ts, o que é preferível e por quê?
declare class Example {
public Method(): void;
}
ou
interface Example {
Method(): void;
}
As diferenças que posso dizer são que as interfaces não podem ter métodos estáticos, então você deve usar uma classe para isso. Ambos não produzem nenhuma saída JS, então talvez isso não importe?
javascript
typescript
Chris
fonte
fonte
Respostas:
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 umaimplements
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 descript
tags em uma página da web). Se você herdar de umclass
usingextends
(independentemente de o tipo base ser adeclare class
ou regularclass
), 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 umdeclare 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
comotypedef
edeclare class
como umaextern
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
edeclare class
é que você não pode usarnew
uma interface. No entanto, se você pretendeextend
/implement
um desses tipos em um novoclass
, é absolutamente necessário ter escolhido corretamente entreinterface
edeclare class
. Apenas um deles funcionará.Duas regras que lhe servirão bem:
new
) que está realmente presente no tempo de execução (por exemploDate
, está, masJQueryStatic
não está)? Se não , você definitivamente querinterface
declare class
fonte
new
operador em um tipo de interface. No entanto, as interfaces podem ter assinaturas de construção, o que significa que você pode chamar onew
operador em um valor do tipo de interface. Isso é muito diferente de comoclass
funciona, em que a assinatura da construção está no próprio nome do tipo, e não em uma expressão desse tipo.Você pode implementar a interface:
Considerando que a
declare class
sintaxe realmente se destina a ser usada para adicionar definições de tipo para código externo que não é escrito em TypeScript - portanto, a implementação é "em outro lugar".fonte
Em termos gerais,
declare
é usado em.ts
/d.ts
files para dizer ao compilador que devemos esperar que a palavra-chavedeclaring
existente exista naquele ambiente, mesmo que não esteja definida no arquivo presente. Isso nos permitirá ter segurança de tipo ao usar o objeto declarado, pois o compilador Typescript agora sabe que algum outro componente pode fornecer essa variável.fonte
Diferença entre
declare
einterface
em TS:declarar:
No código acima,
declare
permite ao compilador TS saber que em algum lugar a classeExample
está declarada. Isso não significa que a classe está magicamente incluída. Você, como programador, é responsável por ter a classe disponível quando você a declara (com odeclare
palavra chave).interface:
A
interface
é uma construção virtual que existe apenas no texto digitado. O compilador de texto digitado o usa com o único propósito de verificação de tipo. Quando o código é compilado para javascript, toda a construção será eliminada. O compilador de texto digitado usa interfaces para verificar se os objetos têm a estrutura correta.Por exemplo, quando temos a seguinte interface:
Os objetos que definimos que têm este tipo de interface precisam corresponder exatamente à interface:
fonte