从类型定义

时间:2016-05-22 13:04:56

标签: typescript typescript-typings

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

import repl = require('repl');

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

replServer.context.something = 123;

但它抱怨:"财产'背景'类型' 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 any(object?),然后以某种方式覆盖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),但它取决于我将其命名为之后的目录 {{1} }。

我使用Atom和我使用的插件会自动更改"文件" typings中的字段列出要包含在文件中的文件。

如果我的文件在"文件"中tsconfig.json之前。 (由Atom插件管理),这不起作用。它需要在它之后(否则,这将生效:typings/globals/node/index.d.ts)。

"适当的"这样做的方式?

1 个答案:

答案 0 :(得分:2)

  

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

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

替代

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

仍然优于JavaScript(完全没有帮助)。