1

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

import repl = require('repl');

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

replServer.context.something = 123;

但它抱怨:“类型'EventEmitter'上不存在属性'context'”。

我已经安装了类型定义,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添加 a),但这取决于我将其命名为之后 typings的目录。

我正在使用 Atom,并且我正在使用的插件会自动更改“文件”字段tsconfig.json以列出要包含以进行编译的文件。

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

这样做的“正确”方式是什么?

4

1 回答 1

2

这样做的“正确”方式是什么?

外部模块定义会被锁定。如果context支持,建议你对原始定义文件进行 PR。

选择

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

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

于 2016-05-23T01:09:54.200 回答