【问题标题】:MomentJS type definition with Typescript 2.0使用 Typescript 2.0 定义 MomentJS 类型
【发布时间】:2016-10-21 01:25:51
【问题描述】:

好的,我的第一个关于 SO 的问题,多么令人兴奋! :)

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

我可以通过 npm install @types/angular --save-dev 来让 Angular 定义正常工作。

但是,MomentJS (2.15.1) 已经附带了moment.d.ts,作为您安装它时获得的包的一部分。

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

npm WARN 已弃用 @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 找不到名称“时刻”。

我还尝试在tsconfig.json 上使用"typeRoots" 配置,但没有任何运气。

这是我package.json的相关文章:

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

如果这很重要,我正在使用 VS2015。

那么...关于如何让 Typescript 2.0 读取位于“意外”文件夹中的 Moment 类型定义的任何想法?

【问题讨论】:

  • 我也遇到了同样的问题,你找到解决办法了吗?
  • 我也有这个问题
  • 遇到同样的问题,暂时找不到解决办法
  • 我也有这个问题,fwiw。
  • 同上。有什么解决办法吗?浪费了半天。。有答案的请留言。

标签: visual-studio-2015 momentjs typescript2.0


【解决方案1】:

您会在node_modules\moment 下找到moment.d.ts 文件,因为它是与时刻本身一起打包的。

使用 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.ts (2.18.1) 中,此类型否则无法访问。

过去我使用var moment = require("moment");,但在您的设置中这可能是不可能的,除非您运行browserifyrequirejsCommonJS/AMD-style 要求转换为浏览器支持的东西.

【讨论】:

    【解决方案2】:

    我在其他地方找到了(但不记得在哪里),你应该这样做

    通过将 export 语句替换为

    来更改 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'. 我不明白。

    【讨论】:

    • 这是参考:github.com/DefinitelyTyped/DefinitelyTyped/issues/11864 线程 似乎 的 OP 能够通过不添加 hack 来解决。但是,线程中提到的所有步骤都不适合我。解决方法仍然按照@rekna 的状态进行。
    • import * as moment... 对我不起作用,但这样的参考有效: ///
    【解决方案3】:

    我有同样的问题。我读了这个comment 并将declare var moment; 添加到custom-typings.d.ts。然后它工作正常,但我不明白为什么。

    VS2015 SP3 + TypeScript2.0.6.0,基于 angular2-webpack-starter 的项目。

    【讨论】:

      【解决方案4】:

      customer-typings.d.ts 文件中执行以下操作对我有用

      ///<reference path="node_modules/moment/moment.d.ts"/>
      import moment = Moment;
      declare const moment: Moment;
      

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

      【讨论】:

        猜你喜欢
        • 2017-12-23
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 2017-12-21
        • 2019-04-01
        • 2017-02-27
        • 2019-10-25
        • 1970-01-01
        相关资源
        最近更新 更多