2

当我查看 Backbone 声明文件时,我看到:

export class Router extends Events {
    ...
    constructor (options?: RouterOptions);
    initialize (options?: RouterOptions);
    ...
}

以及类具有没有实现的方法定义的其他地方。我认为这种语法是为接口保留的。编译器允许它在声明文件中传递,而不是在我自己的 ts 文件中。

.d.ts.ts扩展名的编译规则有区别吗?如果是这样,这些类型的类应该如何与接口不同地使用?

4

2 回答 2

11

.d.ts文件用于描述某个类的现有JavaScript 或 TypeScript 实现。

a 中的类.d.ts(我将其称为“ declare class”,因为它们是等价的)与虚拟类或接口完全不同。当您声明 adeclare class时,您是在说“还有其他一些具有这种形状的类”。当您extend使用该类时,编译器将假设在运行时确实存在一个具有该名称的类(或足够类类的东西)以用作原型链中的下一个指针,从而发出代码。

举个例子,这段代码(本身)不起作用——你会得到一个运行时错误,因为Foo没有在任何地方定义:

declare class Foo {  public bar(): void; }
class FooDerived extends Foo { }

另一方面,这段代码很好:

interface Foo { bar(): void; }
class FooImpl implements Foo { public bar() {} }
于 2013-01-14T17:41:36.607 回答
3

如果文件有.d.ts扩展名,则所有类都被视为前面有declare关键字。声明不需要实现,它们只提供类型信息。

于 2013-01-14T09:28:28.413 回答