寻求更好地理解声明外部javascript模块(编写.d.t.s文件)

时间:2015-02-03 17:53:36

标签: typescript

经过一些试验和错误后,我想出了如何为复杂的NPM javascript包编写.d.ts文件。该软件包使用bluebird promises,因此需要导入bluebird并导出bluebird Promise接口。我发现的解决方案归结为这样的事情:

/// <reference path='../typings/bluebird/bluebird.d.ts' />

declare module 'other' {
  import Promise = require('bluebird');

  interface Foo {
    func1(): Promise<void>;
  }

  var Other: Foo;
  export = Other;
}

declare module Other {
  export module X {
    export interface Y {
      func2(): Promise<void>;
    }
  }
}

此文件中没有任何地方显式导出Promise,但是Typescript应用程序可以通过引用路径和import Other = require('other');导入此模块,然后使用类型Promise,甚至不需要将类型作为范围Other.Promise

我看过手册和语言规范,试图更好地理解无济于事,但也许我错过了一些东西。似乎export = <identifier>;导出的内容多于标识符。谁能开导我?

2 个答案:

答案 0 :(得分:1)

问题出在bluebird.d.ts

declare class Promise<R> implements Promise.Thenable<R>, Promise.Inspection<R>

它在全局范围内声明该类。

答案 1 :(得分:1)

  

此文件中没有任何地方显式导出Promise,但是Typescript应用程序可以通过引用路径导入此模块并导入Other = require('other');

当文件a执行/// <reference foo后文件b执行/// <reference a时,文件b 会隐式引用{{ 1}}

此处您的文件引用了foo,因此bluebird您的文件将隐含地引用references

参考与导入

如果文件中没有根级bluebird / /// <reference

import 有效。如果文件中存在根级export,则将其视为外部模块,并且只能在另一个文件中引入相应的export