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

时间:2013-01-14 02:39:02

标签: javascript typescript

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

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

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

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

2 个答案:

答案 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个关键字。声明不需要实现,它们只提供类型信息。