我正在开发一个普通的JavaScript库,并定义了一个JS类,如下所示:
class MyClass {
static create() {
return new MyClass();
}
doOneThing() {
// ...
return this;
}
doOtherThing() {
// ...
return this;
}
}
module.exports = MyClass;
所以我可以使用类似dsl的语法:
MyClass
.create()
.doOneThing()
.doOtherThing();
我正在尝试为此类添加d.ts
类型文件,其他TypeScript开发人员也可以使用它。
到目前为止,我能做到的最好:
export interface MyClassInstance {
doOneThing(): MyClassInstance;
doOtherThing(): MyClassInstance;
}
export interface MyClassStatic {
create(): MyClassInstance;
}
declare const MyClass: MyClassStatic;
export default MyClass;
因此它适用于TypeScript:
import MyClass from "./src/MyClass";
但是在一个JavaScript文件中,我的IDE通过自动完成工具为我提供了此功能:
MyClass.default.create();
我认为我可以添加强制性解构,将包装在对象中的类导出:
module.exports = {MyClass};
然后,TS和JS的工作方式相同。但是我不愿意。
所以我想知道,是否还有另一种方法-在JS和TS中同时使用静态方法和默认导出工作方式
看来我可以像这样在我的.d.ts
文件中声明一个类而不是接口:
declare class MyClass {
static create(): MyClass;
doOneThing(): this;
doOtherThing(): this;
}
export default MyClass;
JS和TS似乎都可以正常工作,但我仍在检查它是否还可以,还是“不可以”或不好的做法。
更新2
好吧,看来这是我所能得到的最好的。
我还检查了DefinitelyTyped repo,并且某些模块在其类型中使用了class
声明,所以我认为还可以。
答案 0 :(得分:1)
检查export = and import = require()部分:
// change to
export = MyClass;
如果不是本练习的目的,则可以编写TS,并将--declaration传递给编译器,然后让其生成.d.ts文件