好吧,我关于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的类型定义的任何想法,它都位于“意外”文件夹中?
答案 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.tsdeclare 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