合并模块声明文件中名称空间的接口

时间:2016-08-27 21:03:37

标签: typescript type-definition

我有一个javascript库,其中包含一个类型定义文件:https://github.com/tyranid-org/tyranid/blob/master/tyranid.d.ts,它通过typings文件中的package.json属性公开。

定义文件的基本版本:

export default Tyr;

declare namespace Tyr {
  interface Document {
    $save(): Promise<Document>;
  }
}

我想在一个完全独立的打字稿库中扩展Document接口:https://github.com/CrossLead/tyranid-gracl通过向tyranid方法添加$newMethod()方法来导入import Tyr from 'tyranid'; declare namespace Tyr { interface Document { $newMethod(): number; } } 及其输入。文档界面。可以这样做吗?

我在第二个回购中的单独声明文件中尝试了以下内容,但它不起作用:

res.send(data.toObject({ virtuals: true }));

如果需要,我可以修改两个声明 - 我很可能没有正确地为tyranid编写原始类型定义文件。谢谢!

2 个答案:

答案 0 :(得分:3)

以下结束了......

node_modules/tyranid/tyranid.d.ts中的

export = Tyr // must do "import * as Tyr from 'tyranid'" instead of default

declare namespace Tyr {
  export interface Document {
    // original definition...
  }
}
mylib/tyranid-extensions.d.ts ...

declare module "tyranid" {
  interface Document {
    addedMethod(): boolean; 
  }
}

感谢@ pelle-jacobs的帮助!

答案 1 :(得分:2)

您正在尝试扩充模块tyranid。一般语法非常简单:hereredux-thunk扩充redux的示例。

但是,由于tyranid导出default,因此不完全支持模块扩充。已修复export =,如issue中所述。

要扩充tyranid,我能想出的最好的(受comment启发)是将Tyr命名空间放到全局范围内:

<强> node_modules /虫族/ tyranid.d.ts

import * as Express from 'express';
import * as mongodb from 'mongodb';

export default TyrStatic;

declare global {
  namespace TyrStatic {
    // existing implementation of the Tyr namespace
  }
} 

<强> ./ index.d.ts

declare namespace TyrStatic {
  interface specialInterface {
    someProp: number
  }
}

(取决于您是否需要使用此扩充来使用外部模块,您可能需要将其包装在declare global {}中)

<强>的src / app.ts

import Tyr from 'tyranid'
let specialVariable: Tyr.specialInterface = { someProp: 4 }