在Typescript声明文件中引用库类型(不导入全局变量)

时间:2018-01-27 13:41:57

标签: typescript typescript-typings typescript-definitions typescript-declarations

背景

我一直试图为Mocha的Typescript定义做一些补充。 Mocha的Runner继承自NodeJS EventEmitter。在我的.d.ts文件中,我通过添加:

表达了这一点
/// <reference types="node" />

并声明类型:

interface IRunner extends NodeJS.EventEmitter

这符合我的目的,但是在我合并原始PR之后,它被撤消了,因为引用Node这样的类型会导致设置一些全局变量(在这种情况下为setTimeout),这导致与其他项目发生冲突。

摄制

被更改破坏的项目是pjax-api,重新执行的步骤是:

  1. git clone https://github.com/falsandtru/pjax-api
  2. npm install
  3. 使用npm安装包含/// <reference types="node" />的任何输入(示例:@types/asynciterator@types/couchbase@types/mocha@2.2.45);或import * as events from 'events';(例如@ types / artillery)
  4. 使用npx tsc --noEmit -p tsconfig.json
  5. 构建项目

    结果:

    node_modules/spica/throttle.ts(7,5): error TS2322: Type 'Timer' is not assignable to type 'number'.
    node_modules/spica/throttle.ts(28,5): error TS2322: Type 'Timer' is not assignable to type 'number'.
    

    问题

    是否有办法在.d.ts文件中引用另一个.d.ts文件中的某个类型,而不会将所有其他内容纳入范围内。我想要?

    而且,作为一个后续问题,这是否会使其他示例打字与原始更改一样破碎?

    什么有用

    我设法以两种方式解决这个问题,既不完全令人满意:

    1. 将节点签名复制并粘贴到Mocha定义文件。不干,容易出错,会不同步等。
    2. 创建一个单独的本地.d.ts,它与官方定义合并。这对我有用,并且有利于不污染其他消费者。 由于它直接指的是所消费的类型,因此很容易保持同步。但是,必须在每个希望使用它的项目中手动设置它(因为它是本地的,没有其他人可以从中受益)。最后,IRunner 延伸EventEmitter - 所以我觉得我应该能够在打字中表达这一点。
    3. 任何指导赞赏!

0 个答案:

没有答案