Moment.js + TypeScript。找不到名字时刻

Posted

技术标签:

【中文标题】Moment.js + TypeScript。找不到名字时刻【英文标题】:Moment.js + TypeScript. Cannot find name moment 【发布时间】:2016-09-18 13:25:56 【问题描述】:

我在 VisualStudio 中开发带有淘汰赛的 Web 应用程序。我刚刚通过 bower 安装了敲除,在项目中包含了 d.ts 文件,在 html 页面中包含了脚本,现在我可以访问ko

现在我尝试使用 moment.js。与淘汰赛一样:安装,包含 d.ts,将脚本包含到页面,我收到错误 cannot find name 'moment'。添加对 d.ts 的引用没有帮助,import * as moment from 'moment' 得到错误can not find module moment

我知道这是一个愚蠢的问题,但我无法解决它。我做错了什么?

【问题讨论】:

我使用 bower 来获取 moment.js (v 2.13) 并且(至少)对于这个版本,在加载的一堆文件中存在错误的 .d.ts 文件。您只需获取正确的.d.ts 文件,一切都会好起来的。 【参考方案1】:

我建议使用一些工具来管理您的定义。一些流行的选项(您不需要两者,只需选择一个):

    tsd - npm i -g tsd typings - npm i -g typings

它们的工作方式与包管理器类似。您可以安装您的定义,例如 npm/bower 安装您的依赖项。

一旦您安装了其中一个,请转到您的项目并安装 moment + 它的定义

npm install moment --save

其中之一:

tsd install moment --save
typings install moment --save --ambient

这两个都将创建一个文件夹,其中包含您的定义(都称为类型),并且两者都有一个“伞形”定义文件,您应该在应用程序的入口点中引用它(首先是 tsd ,第二个用于打字):

/// <reference path="typings/tsd.d.ts" />
/// <reference path="typings/index.d.ts" />

完成此操作后,您可以像使用 Moment(或任何其他模块)一样:

import * as moment from 'moment'
moment.isDate("I'm not a date")

我建议看看这些:

https://github.com/DefinitelyTyped/tsdhttps://github.com/typings/typings

【讨论】:

从 TypeScript 2.0 开始,这可以在没有 tsdtypings 的情况下完成,请参阅:blogs.msdn.microsoft.com/typescript/2016/06/15/… 我不相信这是最好的(或至少不是唯一的)答案 - 下面劳尔的回答为我解决了这个问题。【参考方案2】:

就我而言,最终通过执行以下操作来解决此错误:

    tsconfig.json 文件的compilerOptions 部分添加此选项"allowSyntheticDefaultImports": true,已编辑:与moment doc 一样。在注意: @ 987654325@) 还在同一compilerOptions 部分添加"moduleResolution": "node"。 (在网上找到了这个选项) 像这样导入moment模块import * as moment from 'moment';

【讨论】:

谢谢。我在 moment 文档中找到了 (1),但就其本身而言,这还不够 - 一旦我完成 (2) 它就开始工作了。 @BartRead 我已经编辑了答案并提供了当它说如果它不起作用尝试"allowSyntheticDefaultImports": true【参考方案3】:

这似乎为我解决了问题(该线程中的其他解决方案不起作用):

import * as moment from 'moment/moment.js';

即使直接引用 js 文件,我似乎仍然可以获得正确的打字稿定义。我怀疑原因是 node_modules 下的“moment”文件夹没有 index.js 文件,但我不是打字稿打字/编译器专家。

【讨论】:

【参考方案4】:

尝试添加以下代码,它对我有用

import * as MomentD from "node_modules/moment/moment.d";

【讨论】:

为我工作:import moment, Moment from "moment/moment.d"; @amirnissim :您的评论必须是一个答案,因为它对我有用。谢谢你:) 使用 moment 并更改其 import 语句的 npm 依赖项怎么样?【参考方案5】:

我今天也犯了同样的错误。 解决方法是将 package.json 中的“moment”包从“2.25.0”降级为“2.22.1”

我的应用程序是 Angular 8 版本和“打字稿”:“3.5.3

【讨论】:

谢谢,我正在失去理智。降级解决方法对我有用【参考方案6】:

对我来说,错误来自 2.25.0 版。 目前的解决方法是降级到 2.24.0。

在 moment@2.25.0 - package.json :

"typesVersions": 
    ">=3.1": 
      "*": [
        "ts3.1-typings/*"
      ]
    
  

但文件夹“ts3.1-typings”不存在。如果您的 typescript 版本是 3.1 或更高版本,则会出现错误:

Cannot find module 'moment'

Github 问题:https://github.com/moment/moment/issues/5486

【讨论】:

我们也遇到过这种情况。【参考方案7】:

在角度你可以这样做:

declare const moment: any;

导入后。

【讨论】:

【参考方案8】:

我已修复它以在 tsconfig.app.json 文件中添加 "allowSyntheticDefaultImports": true 属性并删除 "angularCompilerOptions": "enableIvy": false。在 package.json "moment": "^2.28.0", "ngx-daterangepicker-material": "4.0.1", "tslib": "^2.0.0",

【讨论】:

【参考方案9】:

在需要在项目的根级别创建的typings.d.ts文件中声明如下。

declare module 'moment' 
    const moment: any;
    export = moment

【讨论】:

以上是关于Moment.js + TypeScript。找不到名字时刻的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 2 typescript 应用程序中使用 moment.js 库?

typescript moment.jsのDIFFメソッドの挙动

moment.js 是单例吗?

moment.js的常用方法

moment.js的方法总结

Moment.js:moment(string,format)源码解析