我正在努力在Angular 2 Typescript应用程序中使用moment.js库。即使在阅读了this question的答案之后,我也无法让它发挥作用。
这是我到目前为止所做的:
我配置System.js来检索时刻库:
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
},
moment: {
main: 'moment.js',
type: 'cjs',
defaultExtension: 'js'
}
},
map: {
moment: 'node_modules/moment'
}
});
typings install moment-node --ambient --save
和typings install moment --ambient --save
安装了打字稿类型,所以我可以在typings / main / ambient / moment-node和typings / main / ambient / moment中看到正确的输入现在,如果在我的代码中我使用import * as moment from 'moment';
打字稿编译顺利运行,我可以在Atom编辑器中看到正确的建议(如果我从moment().
开始,我可以看到年(),月()等)。但是,如果我在浏览器中运行我的代码,它会给出一个错误,说'时刻不是一个函数'(调试我可以看到那个时刻是一个有很多方法的对象)。
如果我写import moment from 'moment';
浏览器中的代码运行正常,但是打字稿编译失败并且'模块时刻没有默认导出',并且在编写代码时我无法从Atom获得任何建议。
我做错了什么?在Angular 2打字稿应用程序中导入moment.js(和任何非打字稿库)的正确方法是什么?
答案 0 :(得分:4)
import * as moment_ from 'moment';
const moment:moment.MomentStatic = (<any>moment_)['default'] || moment_;
答案 1 :(得分:4)
正如进一步指出的那样,现在船只有自己的打字。 @ angular / cli也改变了。更新了我的回答以反映这一点。
npm i - 保存时刻
import * as moment from 'moment';
export class SomeClass implements OnInit {
date: moment.Moment;
ngOnInit() {
this.date = moment();
}
}
是@ angular / cli所需要的一切。
以下是我过时的答案。
使用angular-cli:所以你在VsCode中得到Intellisense
编辑 - &gt;角-CLI-build.js
module.exports = function(defaults) {
return new Angular2App(defaults, {
vendorNpmFiles: [
...
'moment/min/**', // add this line
...
]
});
};
编辑 - &gt;系统config.ts
const map: any = {
moment: 'vendor/moment/min/moment.min.js' // add this line
};
在您的组件中:
import * as moment from 'moment';
...
// example of usage
dates: moment.Moment[] = [];
ngOnInit() {
let date = moment();
date.add(2, 'days');
this.dates.push(date);
}
答案 2 :(得分:1)
我也发现了这个: 使用NPM安装Moment.js:
npm install moment
将其添加到您的SystemJS配置中:
map: {
'angular2': 'node_modules/angular2',
'rxjs': 'node_modules/rxjs',
'moment': 'node_modules/moment/moment'
}
您还需要界面:
tsd install moment --save
然后添加:
/// <reference path="typings/moment/moment.d.ts" />
import * as moment from 'moment';
答案 3 :(得分:1)
从index.html添加
<script src="../node_modules/moment/moment.js"></script>
在您的组件中使用:
declare var moment: any;
...
this.startDate = moment().subtract(15, 'days').format('DD-MM-YYYY');
this.endDate = moment().format('DD-MM-YYYY');
答案 4 :(得分:0)
使用 namespace 语法导入模块以将导出收集到单个对象时(如import * as moment from 'moment'
中所示),您不会导入模块导出的实际时刻对象,而是所有成员。您正在丢失呼叫签名。要解决此问题,请在SystemJS + TypeScript项目中指定值&#34; system&#34; for module或者值为true
的allowSyntheticDefaultImports,将它们传递给TypeScript编译器,最好通过tsconfig.json
文件。
然后像这样导入时刻
import moment from 'moment';
一切都会奏效。