J'utilise JSPM
, AngularJS
, TypeScript
, SystemJS
et ES6
et mon projet fonctionne plutôt bien ... sauf si j'essaie d'utiliser momentJS.
C'est l'erreur que j'obtiens:
TypeError: le moment n'est pas une fonction
Cela fait partie du code:
import * as moment from 'moment';
Plus:
var momentInstance = moment(value);
Si je le débogue, moment est un objet et non une fonction:
Voici à quoi ressemble mon paquet JSPM moment.js:
module.exports = require("npm:[email protected]/moment.js");
J'ai beaucoup lu et je n'ai pas trouvé le moyen de résoudre ce problème ... des idées?
Certaines choses que j'ai lues/essayées:
Comment utiliser momentjs dans TypeScript avec SystemJS?
https://github.com/angular-ui/ui-calendar/issues/154
https://github.com/jkuri/ng2-datepicker/issues/5
Les systèmes de modules TypeScript sur momentJS se comportant étrangement
https://github.com/dbushell/Pikaday/issues/153
Merci!
Supprimez simplement le groupement (* as
) de votre déclaration d'importation:
import moment from 'moment';
Sans entrer trop profondément dans le code source , il semble que moment
exporte généralement une fonction, qui comporte toutes sortes de méthodes et d’autres propriétés.
En utilisant * as
, vous récupérez effectivement toutes ces propriétés et les attachez à un objet new, détruisant ainsi la fonction d'origine. Au lieu de cela, vous ne voulez que l’export en chef (export default
dans ES6, objet module.exports
dans Node.js).
Alternativement, vous pourriez faire
import moment, * as moments from 'moment';
pour obtenir la fonction moment asmoment
et toutes les autres propriétés d'un objet appelé moments
. Cela semble un peu moins logique lors de la conversion d'exportations ES5 comme celle-ci en style ES6, car moment
conservera les mêmes propriétés.
Une erreur JS débutante qui me donnait la même erreur:
foobar(moment) {
console.log(moment().whatever());
}
Nommer un paramètre moment
interrompt l'accès à la fonction moment()
.
Cela a fonctionné pour moi:
import moment from 'moment/src/moment'