TypeScript 2.0中的MomentJS类型定义

7

好的,这是我在SO上的第一个问题,多么令人兴奋啊!

我正在尝试让MomentJS定义与Typescript 2.0一起使用。

我没有任何问题可以获得Angular定义的工作,只需执行 npm install @types/angular --save-dev 即可。

但是,MomentJS(2.15.1)已经随着您安装它时获取的软件包的一部分而附带了 moment.d.ts

如果您尝试对angular进行类似的方法,即 npm install @types/moment --save-dev ,则会得到以下结果:

npm WARN deprecated @types/moment@2.13.0:这是Moment的存根类型定义( https://github.com/moment/moment )。 Moment提供自己的类型定义,因此您不需要安装@types/moment!

当然,如果您转到 node_modules \ @ types \ moment ,那里没有什么有用的东西。

是的,我已经在我的根文件夹上添加了 tsconfig.json 文件,因此Typescript 2.0将自动从node_modules中获取@types(这就是为什么Angular运行良好的原因),但是对于MomentJS,我会收到下面的错误(因为.d.ts不在TS2期望它在的位置):

TS2304无法找到名称“moment”。

我还尝试在没有任何运气的情况下使用“typeRoots”配置在 tsconfig.json 上玩耍。

这是我的 package.json 的相关部分:

{
  "devDependencies": {
    "@types/angular": "^1.5.16"
  },
    "dependencies": {
        "moment": "^2.15.1"
    }
}

我正在使用VS2015,如果这有关系的话。

那么...有没有关于如何让Typescript 2.0读取Moment类型定义的想法,因为它位于一个"意外"的文件夹中?


2
我遇到了同样的问题,你找到解决方案了吗? - Joshua
2
我也有这个问题。 - mosesfetters
2
目前我也遇到了同样的问题,暂时找不到解决方法。 - Jochen
1
我也遇到了这个问题,顺便说一下。 - Julian
同样的问题。有解决方案吗?已经浪费了半天时间..如果你有答案,请发布出来。 - howardlo
对于所有询问我是否找到解决方案的人,不,我没有。我最终放弃了。那已经是8个月前的事了。我甚至无法测试下面的答案是否有效,所以也许你们可以尝试一下并告诉我是否有效,这样我就可以标记为答案。 - Caio Campos
4个回答

4
您可以在 node_modules\moment 下找到 moment.d.ts 文件,因为它是与 moment 一起打包的。
使用 VS 2017 和 TypeScript 2.2,您无需指定 typeRoots,但是您的环境可能需要指定两个或更多的根目录,例如: typeRoots: [ 'node_modules/@types/', 'node_modules/moment/' ] ^ 我忘记每个 @types 子目录是否需要在 typeRoots 中添加一个条目。
这是我在 VS 2017TypeScript 2.2 中使用的过程,没有对 tsconfig.json 进行任何特殊更改(但这些内容在更近期的版本中有所改变):
通过 ES6 风格的导入自动发现: import * as moment from "moment"; 这将把名为 moment 的函数以及合并到单个别名中的命名空间 moment 导入。
如果您还想要导入 Moment(返回类型),请执行以下操作: import { Moment } from "moment"; 在当前的 moment.d.ts2.18.1)中,否则无法访问此类型。
过去我使用了 var moment = require("moment");,但是除非您运行 browserifyrequirejsCommonJS/AMD 风格的 require 转换为浏览器支持的内容,否则可能无法在设置中使用。

3
我在其他地方找到了一些(但不记得是哪里),你应该将moment.d.ts更改为以下内容:
declare module 'moment' {
   export default moment;
}

在您的项目中添加一个名为fixmoment.ts的虚拟文件,其中包含以下代码行:

import * as moment from 'moment';

现在使用tsc直接编译所有文件。不幸的是,VS2015仍然会出现错误 tsc : error TS2688: Build:Cannot find type definition file for 'moment'. 我不理解这个错误。


这是参考链接:https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11864。该帖子的原始发布者似乎已经通过不添加hack来解决了问题。然而,该帖子中提到的任何步骤都对我无效。解决方法仍然是按照@rekna所述进行操作。 - user1821052
import * as moment... 对我没用,但是像这样的引用可行:/// <reference path="../wwwroot/lib/moment/moment.d.ts" /> - howardlo

1
我曾经遇到过相同的问题。我阅读了comment,并向custom-typings.d.ts添加了declare var moment;。然后它就正常工作了,但我不明白为什么。
这是一个基于angular2-webpack-starter的项目,使用的是VS2015 SP3和TypeScript2.0.6.0。

1
在一个名为customer-typings.d.ts的文件中执行以下操作对我有效。
///<reference path="node_modules/moment/moment.d.ts"/>
import moment = Moment;
declare const moment: Moment;

我甚至不需要对 tsconfig.json 文件进行任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接