我正在使用JSPM
,AngularJS
,TypeScript
,SystemJS
和ES6
,我的项目运行良好......除非我尝试使用momentJS。
这是我得到的错误:
TypeError:时刻不是函数
这是代码的一部分:
import * as moment from 'moment';
更多:
var momentInstance = moment(value);
如果我调试它,时刻是一个对象而不是一个函数:
这就是我的moment.js JSPM包的样子:
module.exports = require("npm:moment@2.11.0/moment.js");
我已经阅读了很多内容并且无法找到解决这个问题的方法......任何想法?
我读过/试过的一些事情:
How to use momentjs in TypeScript with SystemJS?
https://github.com/angular-ui/ui-calendar/issues/154
https://github.com/jkuri/ng2-datepicker/issues/5
Typescript module systems on momentJS behaving strangely
https://github.com/dbushell/Pikaday/issues/153
谢谢!
答案 0 :(得分:54)
只需从导入语句中删除分组(* as
):
import moment from 'moment';
如果没有深入研究source code,看起来moment
通常会导出一个函数,它附加了各种方法和其他属性。
通过使用* as
,您可以有效地抓取所有这些属性并将它们附加到 new 对象,从而破坏原始功能。相反,您只需要主要导出(ES6中的export default
,Node.js中的module.exports
对象。
或者,您可以
import moment, * as moments from 'moment';
获取当前函数为 moment
,以及名为moments
的对象上的所有其他属性。将ES5导出这样的ES5导出转换为ES6样式时,这有点不太明显,因为moment
将保留相同的属性。
答案 1 :(得分:0)
这对我有用:
import moment from 'moment/src/moment'
答案 2 :(得分:0)
一个初学者的JS错误给了我同样的错误:
foobar(moment) {
console.log(moment().whatever());
}
命名参数moment
会中断对moment()
函数的访问。
答案 3 :(得分:0)
我具有以下代码格式,并且遇到了类似的错误。
export const input = {
year: moment().year()
};
class EventExplorer extends Component {
state = {};
// rest of the code
}
然后将输入对象移至 EventExplorer类内,如下所示
class EventExplorer extends Component {
state = {};
input = {
year: moment().year()
};
// rest of the code
}`
答案 4 :(得分:0)
在官方文档momentJs中的AS图中,我的问题通过nodeJS方法解决了:
var moment = require('moment');
moment(); //this does not emit the errors
答案 5 :(得分:0)
要使矩函数发挥作用,如果您使用的是ES6和babel,则必须以这种方式导入它:
import moment from 'moment'
而不是文档中所写的
import * as moment from 'moment'