【发布时间】:2016-09-19 08:59:21
【问题描述】:
我刚刚开始使用 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),但这取决于我将其命名为之后 typings 之后的目录。
我正在使用 Atom,并且我正在使用的插件会自动更改 tsconfig.json 中的“文件”字段以列出要包含以进行编译的文件。
如果我的文件在“文件”(由 Atom 插件管理)中位于 typings/globals/node/index.d.ts 之前,则此方法不起作用。它需要在它之后(否则,它会生效:export function start(options: ReplOptions): events.EventEmitter;)。
这样做的“正确”方法是什么?
【问题讨论】:
标签: typescript typescript-typings