【问题标题】:Webpack & TypeScript - Include Moment.js PluginsWebpack 和 TypeScript - 包括 Moment.js 插件
【发布时间】:2025-12-24 01:40:07
【问题描述】:

我想在我的 Angular 4 应用程序中使用 JDateFormatParserMoment.js


我成功地安装和使用Moment.js 使用:
npm install moment --save

并将其添加到我的.ts 使用:

import * as moment from 'moment';

我可以使用和执行它。


之后我使用以下方式安装了插件:
npm install moment-jdateformatparser --save

当我想在我的代码中使用它时:

moment().toJDFString(moment.localeData().longDateFormat('L'))

我的 IDE 已经投诉:

TS2339:“Moment”类型上不存在属性“toJDFString”。


看看this answer,我尝试使用强制转换来做到这一点:

(<any>moment()).toJDFString(moment.localeData().longDateFormat('L'))

这解决了 IDE 中的错误,但在执行过程中控制台告诉我:

TypeError: WEBPACK_IMPORTED_MODULE_6_moment(...).toJDFString 是 不是函数


有人提示如何使用它吗?

【问题讨论】:

  • 安装插件后你导入moment的方式一样吗?如果没有,你可以试试import * as moment from "moment-jdateformatparser";
  • 如果它和我用过的其他插件一样,你可能需要在 moment 模块上“注册”它。导入两者并通知时刻存在插件。当然,这是假设这个插件不依赖于单例模块(可能挂在窗口之外)。
  • @Wernerson :非常感谢,这解决了这两种情况下的问题,对于 IDE(现在可以不强制转换)和执行!如果您添加答案,我会接受。不过我问的是如何处理多个插件呢?

标签: angular typescript webpack momentjs


【解决方案1】:

您必须导入moment-jdateformatparser,因为它只是将其功能添加到时刻并导出moment

import * as moment from "moment-jdateformatparser";

至于使用多个插件似乎目前还没有一个好的解决方案或者至少我还没有找到一个干净的方法。

一种选择是您分别导入这两个插件并以不同的方式命名它们,如下所示:

import * as momentJdate from "moment-jdateformatparser";
import * as momentTimezone from "moment-timezone";

如果你想这样的话,你可以在之后合并它们(使用 deepExtend):

let moment = {};
deepExtend(moment, momentJdate, momentTimezone);

//here you should be able to use moment().toJDFString() and moment.tz.names()

在我看来,这些选项都不是干净,但它们都应该有效。我也从来没有在一个文件中使用过超过一个时刻的插件,所以像这样的解决方法可能没问题。

【讨论】:

  • 如果有更好的解决方案来使用多个插件,我会问一个关于 SO 的新问题,因为我真的没有找到更好的解决方案。
  • Here's 有兴趣的问题。