当我查看Backbone声明文件时,我看到了:
export class Router extends Events {
...
constructor (options?: RouterOptions);
initialize (options?: RouterOptions);
...
}
以及其他类具有没有实现的方法定义的地方。我认为这种语法是为接口保留的。编译器允许它传入声明文件,但不传入我自己的ts文件。
.d.ts 与 .ts 扩展程序的编译规则之间是否存在差异?如果是这样,这些类的类应该如何与接口使用不同?
答案 0 :(得分:9)
.d.ts
个文件用于描述某些类的现有 JavaScript或TypeScript实现。
.d.ts
中的一个类(我将它称为“declare class
”,因为它们是等效的)与虚拟类或接口完全不同。当你宣布一个declare class
时,你会说“还有一些其他类会出现这种形状”。当你extend
那个类的时候,编译器会在假设确实会有一个类(或类似于类的东西)的情况下发出代码,在运行时将该名称作为原型链中的下一个指针使用
就像一个例子,这段代码(单独)不起作用 - 您将收到运行时错误,因为Foo
未在任何地方定义:
declare class Foo { public bar(): void; }
class FooDerived extends Foo { }
另一方面,这段代码很好:
interface Foo { bar(): void; }
class FooImpl implements Foo { public bar() {} }
答案 1 :(得分:3)
如果文件的扩展名为.d.ts
,则会将所有类视为前面有declare
个关键字。声明不需要实现,它们只提供类型信息。