You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为默认导出的JS类静态工厂方法编写兼容TS/JS的类型定义?

你的写法完全合规,不属于不良实践

首先可以明确告诉你:你现在用declare class配合export default的类型定义写法是完全符合TypeScript规范的,而且是处理这类CommonJS单值导出场景的推荐方式之一,DefinitelyTyped仓库里大量模块都采用这种写法,完全不用担心。

为什么这个写法能解决你的问题?

你的原生JS代码用的是CommonJS的module.exports = MyClass,本质是把整个类作为模块的唯一导出值。而TypeScript的declare class定义了类的结构,再通过export default MyClass将其标记为模块的默认导出,正好对应了JS代码的导出逻辑:

  • 对于TypeScript用户:可以用现代ES模块风格的import MyClass from './myclass'导入,类型检查和调用完全正常。
  • 对于JavaScript用户:IDE会自动识别这个默认导出与CommonJS导出的对应关系,不会再提示需要调用MyClass.default.create(),直接补全MyClass.create()即可,完美匹配你不想修改JS导出方式的需求。

额外的验证与补充

如果你还不放心,可以测试这两个场景:

  • 在TS文件中导入后调用MyClass.create().doOneThing().doOtherThing(),TypeScript会正确推断出链式调用的类型(因为你用了this作为返回值类型,这部分写得很规范)。
  • 在JS文件中用const MyClass = require('./myclass')导入,IDE的自动补全应该直接显示create()、doOneThing()等方法,不会出现多余的.default。

这种写法既兼顾了CommonJS原生JS的兼容性,又符合TypeScript的类型系统设计,完全没问题。

内容的提问来源于stack exchange,提问作者Treble Snake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:52:29