如何使用默认导出在 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 文件
我正在开发一个 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 文件