【问题标题】:Merge interface from namespace in module declaration file从模块声明文件中的命名空间合并接口
【发布时间】:2016-08-27 21:03:37
【问题描述】:

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

定义文件的基本版本:

export default Tyr;

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

我想在一个完全独立的打字稿库中扩展Document 接口:https://github.com/CrossLead/tyranid-gracl,它通过向文档接口添加$newMethod() 方法来导入tyranid 及其打字。这个可以吗?

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

import Tyr from 'tyranid';

declare namespace Tyr {

  interface Document {
    $newMethod(): number;
  }

}

如有必要,我可以修改这两个声明——很可能我没有正确编写 tyranid 的原始类型定义文件。谢谢!

【问题讨论】:

    标签: typescript type-definition


    【解决方案1】:

    以下最终工作......

    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 的帮助!

    【讨论】:

    • 实际上——这会引起更多的麻烦,因为 tyranid 库本身是围绕主模块的默认导出构建的。
    • 没错。我的假设是您不想更改实际的 js 库。嗯¯\_(ツ)_/¯
    【解决方案2】:

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

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

    为了扩充tyranid,我能想到的最好办法(受此comment 的启发)是将Tyr 命名空间放入全局范围:

    node_modules/tyranid/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 }
    

    【讨论】:

    • 感谢您的帮助!看起来我收到错误“模块扩充无法在顶级范围内引入新名称”。不过,当遵循这种格式时——有什么想法吗?此处示例:typescriptlang.org/play/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多