How can I describe a JavaScript class static factory method in TypeScript typings with default export?
我正在开发一个普通的JavaScript库,并定义了一个JS类,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class MyClass { static create() { return new MyClass(); } doOneThing() { // ... return this; } doOtherThing() { // ... return this; } } module.exports = MyClass; |
所以我可以使用类似dsl的语法:
1 2 3 4 | MyClass .create() .doOneThing() .doOtherThing(); |
而且我正在尝试为此类添加
到目前为止,我能做到的最好:
1 2 3 4 5 6 7 8 9 10 11 | export interface MyClassInstance { doOneThing(): MyClassInstance; doOtherThing(): MyClassInstance; } export interface MyClassStatic { create(): MyClassInstance; } declare const MyClass: MyClassStatic; export default MyClass; |
因此它适用于TypeScript:
1 | import MyClass from"./src/MyClass"; |
但是在一个JavaScript文件中,我的IDE通过自动完成工具为我提供了此功能:
1 | MyClass.default.create(); |
我认为我可以添加强制性解构,将包装在对象中的类导出:
1 | module.exports = {MyClass}; |
然后TS和JS都以相同的方式工作。但是我宁愿不这样做。
所以我想知道,是否还有另一种方法可以在JS和TS中同时使用静态方法和默认导出方式
更新1
看来我可以在
1 2 3 4 5 6 | declare class MyClass { static create(): MyClass; doOneThing(): this; doOtherThing(): this; } export default MyClass; |
JS和TS似乎都可以正常工作,但是我仍在检查它是否还可以,还是"不可以"或不好的做法。
更新2
好吧,这似乎是我能得到的最好的。
我还检查了DefinitelyTyped存储库,并且某些模块在其类型中使用了
检查部分export =和import = require():
1 2 | // change to export = MyClass; |
如果本身不做练习,则可以编写TS,并将--declaration传递给编译器,并让其生成.d.ts文件。