Typescript声明文件包含没有成员实现的类定义

par*_*ent 3 javascript typescript

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

export class Router extends Events {
    ...
    constructor (options?: RouterOptions);
    initialize (options?: RouterOptions);
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

.d.ts.ts扩展的编译规则之间是否存在差异?如果是这样,这些类的类应该如何以不同的方式使用?

Rya*_*ugh 9

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

a中的一个类.d.ts(我只是将它称为" declare class"因为它们是等价的)与虚拟类或接口完全不同.当你声明一个时declare class,你会说"还有一些其他类会出现这种形状".当你使用extend那个类时,编译器会在假设确实存在一个类(或类似于类似的东西)的情况下发出代码,该类在运行时出现,用作原型链中的下一个指针.

仅作为示例,此代码(单独)不起作用 - 您将得到运行时错误,因为Foo未在任何位置定义:

declare class Foo {  public bar(): void; }
class FooDerived extends Foo { }
Run Code Online (Sandbox Code Playgroud)

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

interface Foo { bar(): void; }
class FooImpl implements Foo { public bar() {} }
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的答复。为了亲眼所见,我扩展了一个“声明类”,它与扩展一个空类“class SomeClass { }”完全相同。我将研究编译器发出的用于模拟继承的“原型链”代码,这有点令人困惑。很好的答案,谢谢。 (2认同)