SystemJS - 时刻不是一个函数

时间:2016-02-08 15:09:15

标签: javascript angularjs momentjs systemjs

我正在使用JSPMAngularJSTypeScriptSystemJSES6,我的项目运行良好......除非我尝试使用momentJS。

这是我得到的错误:

  

TypeError:时刻不是函数

这是代码的一部分:

import * as moment from 'moment';

更多:

var momentInstance = moment(value);

如果我调试它,时刻是一个对象而不是一个函数:

enter image description here

这就是我的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

谢谢!

6 个答案:

答案 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'