【问题标题】:Typescript declaration files contain class definitions with no member implementations打字稿声明文件包含没有成员实现的类定义
【发布时间】:2012-12-28 00:19:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

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

    【讨论】:

    • 除了在实现时需要使用“扩展”而不是“实现”之外,这个结构与接口有何不同?对我来说,它似乎类似于一个虚拟类,因为在扩展这个类时没有提供任何实现时编译器不会抱怨。我假设唯一的区别是 base.initialize() 不能被调用。这是正确的吗?
    【解决方案2】:

    .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() {} }
    

    【讨论】:

    • 感谢您的回复。为了自己看,我扩展了一个“声明类”,它就像扩展一个空类“class SomeClass {}”一样。我将研究编译器发出的这个“原型链”代码来模拟继承,这有点令人困惑。很好的答案,谢谢。
    • 但是等等,这似乎是个问题。智能感知很好,但是当我从继承这个声明类的类的实例调用 intialize() 时会发生什么?编译器让它通过,但是没有实现这个方法,甚至在生成的 javascript 中也没有。因此它不会在运行时崩溃吗?
    • 写declare class 的意思是“编译器,我告诉你关于一个已经存在的类;请不要在这里生成代码,但是就好像该类将在运行时出现一样”。如果您编写 declare class 并且实际上没有可以继承的类,那将是一个运行时错误。
    • 我很抱歉,但从实际的角度来看,这对我来说没有意义。我没有编写任何声明类,并且我了解 .d.ts 文件实际上并没有生成任何代码。您评论的最后一行建议我应该为整个声明文件中的每个声明的类编写一个实现。为什么我要从“声明类”而不是接口或常规类继承,这实际上可以防止运行时错误?
    • 我可以把它比作“declare var $: JQueryStatic”。在那里,我为了 INTELLISENSE 声明了 JQueryStatic 类型的 $,如果我不提供实现(加载 jQuery 库),它将在运行时崩溃。同样,从“声明类”继承。我“承诺”在尝试使用之前为成员提供实现,但是如果我不这样做,它将在运行时崩溃。最终,我看不出这个结构有什么好处。 "declare var $ : JQueryStatic" 仅用于为非您编写的外部非 Typescript 库提供类型信息。
    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2017-09-12
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多