使用Typescript 2.0的MomentJS类型定义

时间:2016-10-21 01:25:52

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

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

我试图让MomentJS定义与Typescript 2.0一起使用。

只需执行npm install @types/angular --save-dev,我就没有问题让Angular定义工作。

然而,MomentJS(2.15.1)已经附带moment.d.ts作为您安装时获得的软件包的一部分。

如果你尝试对角度进行类似的处理,即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找不到名字'时刻'。

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

您会在Scanner下找到moment.d.ts文件,因为它与当下包装在一起。

使用VS 2017和TypeScript 2.2,您不必指定node_modules\moment;但是,您的环境可能需要指定其中的两个或多个,例如:

typeRoots

^我忘了每个typeRoots: [ 'node_modules/@types/', 'node_modules/moment/' ]子目录是否需要@types中的条目。

这是我在 VS 2017 TypeScript 2.2 中使用的过程,对typeRoots没有任何特殊更改(但这些内容在更新版本中已更改):

通过ES6样式导入自动找到:

tsconfig.json

这将导入名为import * as moment from "moment";的函数以及合并为单个别名的命名空间moment

如果您还想导入moment(返回类型),请执行以下操作:

Moment

在当前import { Moment } from "moment"; 2.18.1 )中,此类型无法访问。

过去我使用了moment.d.ts,但您的设置可能无法实现,除非您正在运行var moment = require("moment");browserify来转换requirejs / { {1}} - 样式需要浏览器支持的内容。

答案 1 :(得分:3)

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

通过用

替换export语句来更改moment.d.ts
declare module 'moment' {
   export default moment;
}

使用以下行

将虚拟文件fixmoment.ts添加到项目中
import * as moment from 'moment';

现在直接使用tsc编译所有文件。不幸的是,VS2015仍然出错 tsc:error TS2688:Build:找不到'moment'的类型定义文件。 我不明白。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

customer-typings.d.ts文件中执行以下操作

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

我甚至不需要对ts tsconfig.json file

进行任何更改