我刚刚开始使用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
)。
"适当的"这样做的方式?
答案 0 :(得分:2)
这样做的“正确”方式是什么?
外部模块定义受到锁定的影响。如果支持context
,建议您对原始定义文件进行PR。
创建typings
文件的本地副本,不再依赖于上游版本。我也是这样做的:https://github.com/alm-tools/alm/tree/master/src/typings
仍然优于JavaScript(完全没有帮助)。