【问题标题】:How to export typings along with a module?如何将类型与模块一起导出?
【发布时间】:2018-06-04 23:45:14
【问题描述】:

我正在编写一个模块,为我们团队正在使用的测试套件添加一些功能。这是一个包含主要打字稿文件的项目,它包装了我们项目的其他导出。

index.d.ts:

export * from "./OneModule"
export * from "./AnotherModule"

其中一个模块具有向Chai.js 断言库添加新方法的功能。这是通过使用它的函数来添加新方法来实现的,例如:

assertion.addChainableMethod('newMethod', callback, chainCallback)

将增加编写诸如expect(something).to.be.newMethod() 之类的语句的能力。但 TypeScript 无法识别这些新方法,因为 @types/chai 中的类型断言显然没有这些功能。

我已经创建了要与 Chai 断言合并的接口定义,如下所示:

declare namespace Chai {
    interface Assertion {
        newMethod(something: string): Assertion;
        newMethod: Assertion;
    }
}

addChainableMethod 添加了新方法,因此它也可以链为expect(something).to.be.newMethod.equals(),这就是为什么它必须同时定义为属性和方法的原因。

问题是,无论我如何将上述声明添加到 index.d.ts,新的断言在导入项目中都不可见。我怀疑它以某种方式包装在模块名称空间中(但我可能对此非常错误)。我知道我可以做@types/newAssertions 并在那里定义它们,但这需要用户在package.json 中包含2 个项目,并且还要求我们的开发人员同时处理2 个项目。如何导出我的 Chai 命名空间扩展和我拥有的所有模块?

我能做到的最好的事情是这样的:

declare module 'my-module' {
    function AddNewAssertions(chai: any, utils: any): void;
}
declare namespace Chai {
    interface Assertion { //same as above }
}

但是这样我就不能公开我的其他模块,而且它只有在我只公开 AddNewAssertions 函数时才有效,该函数添加了这些断言。不过,这很有效。

【问题讨论】:

    标签: node.js typescript typescript-typings


    【解决方案1】:

    为此我开发了一个非常基本的测试应用程序,并成功添加了:

    declare global {
        namespace Chai {
            interface Assertion {
                newMethod(something: string): Assertion;
                newMethod: Assertion;
            }
        }
    }
    

    这使扩展在您的其他模块中可见,而不仅仅是带有声明的模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多