Reputation: 5114
I'm using JSPM
, AngularJS
, TypeScript
, SystemJS
and ES6
and my project is running pretty well... unless I try to use momentJS.
This is the error I get:
TypeError: moment is not a function
This is part of the code:
import * as moment from 'moment';
More:
var momentInstance = moment(value);
If I debug it, moment is an object not a function:
This is what my moment.js JSPM package looks like:
module.exports = require("npm:[email protected]/moment.js");
I've read a lot and couldn't find a way to solve this... any ideas?
Some things I've read/tried:
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
Thanks!
Upvotes: 49
Views: 64134
Reputation: 582
Remove this
import * as moment from "moment";
add this instead
import moment from "moment";
And that is how it is used in your context
{moment(finalOrder.order.order.order.dateOrdered).format("MM-DD-YYYY")}
Upvotes: 0
Reputation: 1960
To get moment work as a function, if you are using ES6 and babel, you must import it in this way:
import moment from 'moment'
and not, as written in the documentation
import * as moment from 'moment'
Upvotes: 0
Reputation: 1242
AS plot in the official documentation momentJs my problems were solved via nodeJS approach:
var moment = require('moment');
moment(); //this does not emit the errors
Upvotes: 0
Reputation: 1387
A beginner JS mistake that was giving me the same error:
foobar(moment) {
console.log(moment().whatever());
}
Naming a parameter moment
breaks access to the moment()
function.
Upvotes: 0
Reputation: 26365
Simply remove the grouping (* as
) from your import statement:
import moment from 'moment';
Without digging too deeply in to the source code, it looks like moment
usually exports a function, that has all kinds of methods and other properties attached to it.
By using * as
, you're effectively grabbing all those properties and attaching them to a new object, destroying the original function. Instead, you just want the chief export (export default
in ES6, module.exports
object in Node.js).
Alternatively, you could do
import moment, * as moments from 'moment';
to get the moment function as moment
, and all the other properties on an object called moments
. This makes a little less sense when converting ES5 exports like this to ES6 style, because moment
will retain the same properties.
Upvotes: 106