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

How can I describe a JavaScript class static factory method in TypeScript typings with default export?

我正在开发一个 vanilla JavaScript 库并且有一个 JS class 定义如下:

class MyClass {
  static create() {
    return new MyClass();
  }

  doOneThing() {
    // ...
    return this; 
  }

  doOtherThing() {
    // ...
    return this; 
  }
}

module.exports = MyClass;

所以我可以使用类似 dsl 的语法:

MyClass
  .create()
  .doOneThing()
  .doOtherThing();

我正在尝试为此 class 添加 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();

我想我可以添加强制解构,导出我的 class 包裹在一个对象中:

module.exports = {MyClass};

那么TS和JS都是一样的。但我宁愿不要。

所以我想知道,是否有另一种方法可以做到这一点 - 在 JS 和 TS 中同时拥有静态方法和默认导出工作


更新 1

看来我可以像这样在 .d.ts 文件中声明一个 class 而不是接口:

declare class MyClass {
    static create(): MyClass;
    doOneThing(): this;
    doOtherThing(): this;
}
export default MyClass;

JS 和 TS 似乎都可以正常使用它,但我仍在检查它是否可以或有点 "don't" 或不好的做法。


更新 2

嗯,看来这是我能得到的最好的了。 我还检查了 DefinitelyTyped repo 并且一些模块在它们的类型中使用了 class 声明,所以我想没问题。

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

// change to
export = MyClass;

如果不是为了练习本身,你可以在 TS 中编写并将 --declaration 传递给编译器,让它生成 .d.ts 文件