Arquivos de declaração do Typescript contêm definições de classes sem implementações de membros
Quando eu olho para o arquivo de declaração do Backbone, vejo isto:
export class Router extends Events {
...
constructor (options?: RouterOptions);
initialize (options?: RouterOptions);
...
}
e outros lugares onde uma classe tem definições de métodos sem implementações. Eu pensei que essa sintaxe era reservada para interfaces. O compilador deixa passar isso no arquivo de declaração, mas não nos meus próprios arquivos ts.
Existe uma diferença entre as regras de compilação para as extensões .d.ts e .ts? Se sim, como esses tipos de classes devem ser usados de forma diferente das interfaces?
Resposta #1
Arquivos .d.ts servem para descrever uma implementação existente de JavaScript ou TypeScript de alguma classe.
Uma classe em um .d.ts (vou apenas chamar isso de "declare class" já que são equivalentes) é completamente diferente de uma classe virtual ou de uma interface. Quando você declara uma declare class, você está dizendo "Existe alguma outra classe que estará presente e que tem essa forma". Quando você extende essa classe, o compilador vai gerar código com a suposição de que realmente haverá uma classe (ou algo suficientemente parecido com uma classe) com esse nome presente em tempo de execução para usar como o próximo ponteiro na cadeia de protótipos.
Só como exemplo, este código (por si só) não funciona - você receberá um erro em tempo de execução porque Foo não está definido em nenhum lugar:
declare class Foo { public bar(): void; }
class FooDerived extends Foo { }
Este código, por outro lado, está bom:
interface Foo { bar(): void; }
class FooImpl implements Foo { public bar() {} }
Resposta #2
Se o arquivo tiver uma extensão .d.ts, todas as classes são tratadas como se fossem precedidas por uma palavra-chave declare. As declarações não precisam de uma implementação, elas apenas fornecem informações de tipo.
