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

时间:2019-02-08 21:12:49

标签: javascript typescript typescript-typings .d.ts

我正在开发一个普通的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中同时使用静态方法和默认导出工作方式


更新1

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

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

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


更新2

好吧,看来这是我所能得到的最好的。 我还检查了DefinitelyTyped repo,并且某些模块在其类型中使用了class声明,所以我认为还可以。

1 个答案:

答案 0 :(得分:1)

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

// change to
export = MyClass;

如果不是本练习的目的,则可以编写TS,并将--declaration传递给编译器,然后让其生成.d.ts文件