如何增强在Typescript模块上声明但未导出的类

时间:2018-11-16 21:05:46

标签: javascript typescript types

hubot类型定义具有以下类:

declare namespace Hubot {
    // ...

    class Message {
        user: User;
        text: string;
        id: string;
    }

    // ...
}

// Compatibility with CommonJS syntax exported by Hubot's CoffeeScript.
// tslint:disable-next-line export-just-namespace
export = Hubot;
export as namespace Hubot;

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/a6b283d1d43d8c7c82a4a4e22d0fc27c9964154c/types/hubot/index.d.ts#L18-L22

我想在编写的Message文件中,从代码中扩展hubot.d.ts类:

import * as hubot from 'hubot';

declare namespace Hubot {
  export class Message {
    mentions: string[]
  }
}

但是它不起作用: enter image description here

通过{p>将hubot.d.ts文件包含在代码中

  "files": ["types/custom/hubot.d.ts"]

tsconfig.json文件中。

我缺少什么?有什么办法吗?

1 个答案:

答案 0 :(得分:3)

hubot.d.ts应该包含:

// This import serves no purpose except to make the file a module
// (so that the following statement is a module augmentation rather
// than a module declaration) and could be replaced with `export {}`.
import * as hubot from 'hubot';

declare module "hubot" {
  interface Message {
    mentions: string[]
  }
}

需要一个module augmentation才能将声明添加到hubot模块中。由于Hubot命名空间被分配为模块的导出,因此对模块进行的任何扩展都将直接针对该命名空间;在扩充中编写另一个namespace Hubot { ... }会创建一个嵌套的名称空间,这不是您想要的。最后,声明一个类会产生“重复标识符”错误,而声明一个接口足以添加属性。