更改从类型定义导入的类型

Change type imported from typings definition

我刚刚开始使用 Typescript,我正在尝试让编译器让我执行以下操作 replServer.context.something = 123

import repl = require('repl');

let replServer = repl.start({
  prompt: '>> '
});

replServer.context.something = 123;

但它在抱怨:"Property 'context' does not exist on type 'EventEmitter'"。

我已经使用 typings install dt~node --save --global 安装了类型定义,repl 模块在 typings/globals/node/index.d.ts 中定义如下:

declare module "repl" {
    import * as stream from "stream";
    import * as events from "events";

// ...
    export function start(options: ReplOptions): events.EventEmitter;
}

我想解决方案涉及定义我自己的类型扩展 events.EventEmitter,它有一个 context 类型的任何(对象?),然后以某种方式覆盖 typings/globals/node/index.d.ts 中的定义到使用新类型。

这样对吗?它是如何完成的? (我想你不理会 typings/globals/node/index.d.ts 并在某处添加另一个文件(可能在 typings 目录之外))。

Typescript 读取这些定义文件(index.d.ts 和覆盖此定义的文件)的顺序重要吗?

谢谢!

编辑 1:

我最终尝试了我的想法并且它正在工作(但这取决于目录命名......即黑客)。

我添加了 typings2/node/index.d.ts 如下:

declare module "repl" {
    import * as events from "events";

    interface ReplEventEmitter extends events.EventEmitter {
      context: any;
    }

    export function start(options: ReplOptions): ReplEventEmitter;
  }

它工作正常(即保留以前的定义并添加 context),但这取决于我将其命名的目录 after typings.

我正在使用 Atom,我正在使用的插件会自动更改 tsconfig.json 中的 "files" 字段以列出要包含在编译中的文件。

如果我的文件在 "files" 中出现在 typings/globals/node/index.d.ts 之前(由 Atom 插件管理),这将不起作用。它需要在它之后(否则,这将生效:export function start(options: ReplOptions): events.EventEmitter;)。

这样做的 "proper" 方法是什么?

What's the "proper" way of doing this?

外部模块定义受到 锁定 的影响。如果支持 context ,建议您对原始定义文件进行 PR。

备选

创建typings文件的本地副本,不再依赖于上游版本。我也这样做:https://github.com/alm-tools/alm/tree/master/src/typings

仍然比 JavaScript 好(完全没有帮助)。