代码之家  ›  专栏  ›  技术社区  ›  Areinu

如何将打字与模块一起导出?

  •  2
  • Areinu  · 技术社区  · 8 年前

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

    指数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;
        }
    }
    

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

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

    我所做的最好的事情是:

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

    但有了这个,我无法公开其他模块,只有当我只公开AddNewAssertions函数时,它才起作用,该函数添加了这些断言。尽管如此,这还是很有效。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Fenton    8 年前

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

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

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

    推荐文章