如何使用默认导出在TypeScript类型中描述JavaScript类静态工厂方法?

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();

而且我正在尝试为此类添加d.ts类型文件,以便其他TypeScript开发人员也可以使用它。
到目前为止,我能做到的最好:

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

看来我可以在.d.ts文件中声明一个类而不是接口,如下所示:

1
2
3
4
5
6
declare class MyClass {
    static create(): MyClass;
    doOneThing(): this;
    doOtherThing(): this;
}
export default MyClass;

JS和TS似乎都可以正常工作,但是我仍在检查它是否还可以,还是"不可以"或不好的做法。


更新2

好吧,这似乎是我能得到的最好的。
我还检查了DefinitelyTyped存储库,并且某些模块在其类型中使用了class声明,因此我认为还可以。


检查部分export =和import = require():

1
2
// change to
export = MyClass;

如果本身不做练习,则可以编写TS,并将--declaration传递给编译器,并让其生成.d.ts文件。