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 开始,这可以在没有tsd
或 typings
的情况下完成,请参阅: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 库?