Comment moment.js peut-il être importé avec typecript?

J’essaie d’apprendre Typographie. Bien que je ne pense pas que ce soit pertinent, j’utilise VSCode pour cette démo.

J’ai un package.json qui contient ces morceaux:

 { "devDependencies": { "gulp": "^3.9.1", "jspm": "^0.16.33", "typescript": "^1.8.10" }, "jspm": { "moment": "npm:moment@^2.12.0" } } 

Ensuite, j’ai une classe main.js comme ceci:

 import moment from 'moment'; export class Main { } 

Mon gulpfile.js ressemble à ceci:

 var gulp = require('gulp'); var typescript = require('gulp-tsb'); var comstackrOptions = { "rootDir": "src/", "sourceMap": true, "target": "es5", "module": "amd", "declaration": false, "noImplicitAny": false, "noResolve": true, "removeComments": true, "noLib": false, "emitDecoratorMetadata": true, "experimentalDecorators": true }; var typescriptComstackr = typescript.create(comstackrOptions); gulp.task('build', function() { return gulp.src('/src') .pipe(typescriptComstackr()) .pipe(gulp.dest('/dest')); }); 

Quand je lance gulp build, je reçois le message: "../main.ts(1,25): Cannot file module 'moment'."

Si j’utilise le import moment = require('moment'); alors jspm fonctionnera et apportera le module quand je lance l’application, mais je reçois toujours l’erreur de compilation. J’ai aussi essayé:

 npm install typings -g typings install moment --ambient --save 

Au lieu de rendre le problème meilleur, il a empiré. Maintenant, j’obtiens l’erreur ci-dessus lors de la construction, ainsi que les éléments suivants: "../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."

Si je vais dans le fichier fourni par dactylographie et ajoute au bas du fichier:

 declare module "moment" { export = moment; } 

Je peux obtenir la deuxième erreur pour disparaître, mais j’ai toujours besoin de l’instruction require pour obtenir le moment de travailler dans mon fichier main.ts et main.ts toujours la première erreur de génération.

Dois-je créer mon propre fichier .d.ts pour l’instant ou y a-t-il juste un élément de configuration qui me manque?

Mettre à jour

Apparemment, le moment fournit désormais ses propres définitions de type (selon sivabudh au moins à partir de 2.14.1), vous n’avez donc pas besoin de typings ou de @types .

import * as moment from moment doit charger les définitions de type fournies avec le paquet npm.

Cela dit, comme indiqué dans l’ instant / pull / 3319 # issuecomment-263752265, le moment où l’équipe semble avoir des problèmes à maintenir ces définitions (ils sont toujours en train de chercher quelqu’un qui les maintient).


Vous devez installer les saisies de moment sans l’indicateur --ambient .

Puis incluez-le en utilisant import * as moment from 'moment'

Vous devez importer moment () la fonction et Moment la classe séparément dans TS.

J’ai trouvé une note dans les documents typescripts ici .

/ * ~ Notez que les modules ES6 ne peuvent pas exporter directement les fonctions appelables. * ~ Ce fichier doit être importé en utilisant le style CommonJS: * ~ import x = require (‘someLibrary’);

Donc, le code pour importer le moment js dans typescript ressemble à ceci:

 import { Moment } from 'moment' .... let moment = require('moment'); ... interface SomeTime { aMoment: Moment, } ... fn() { ... someTime.aMoment = moment(...); ... } 

via les typages

Moment.js supporte maintenant TypeScript en v2.14.1.

Voir: https://github.com/moment/moment/pull/3280


Directement

Ne serait peut-être pas la meilleure réponse, mais c’est la voie de la force brute, et ça marche pour moi.

  1. Téléchargez simplement le fichier moment.js et incluez-le dans votre projet.
  2. Par exemple, mon projet ressemble à ceci:

$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js

  1. Et voici un exemple de code source:

“ `

 import * as moment from 'moment'; class HelloWorld { public hello(input:ssortingng):ssortingng { if (input === '') { return "Hello, World!"; } else { return "Hello, " + input + "!"; } } } let h = new HelloWorld(); console.log(moment().format('YYYY-MM-DD HH:mm:ss')); 
  1. Utilisez simplement le node pour exécuter main.js

Vous ne savez pas quand cela a changé, mais avec la dernière version de dactylographier, il vous suffit d’utiliser le import moment from 'moment'; et tout le rest devrait fonctionner normalement.

1. installez le moment

 npm install moment --save 

2. tester ce code dans votre fichier typescript

 import moment = require('moment'); console.log(moment().format('LLLL'));