web-dev-qa-db-fra.com

Comment importer moment.js avec le manuscrit?

J'essaie d'apprendre TypeScript. Bien que je ne pense pas que cela soit pertinent, j'utilise VSCode pour cette démo.

J'ai un package.json qui contient ces pièces:

{
  "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 TypeScript 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 compilerOptions = {
                        "rootDir": "src/",
                        "sourceMap": true,
                        "target": "es5",
                        "module": "AMD",
                        "declaration": false,
                        "noImplicitAny": false,
                        "noResolve": true,
                        "removeComments": true,
                        "noLib": false,
                        "emitDecoratorMetadata": true,
                        "experimentalDecorators": true
                      };
var typescriptCompiler = TypeScript.create(compilerOptions);
gulp.task('build', function() {
  return gulp.src('/src')
    .pipe(typescriptCompiler())
    .pipe(gulp.dest('/dest'));
});

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

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

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

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

Si je vais au fichier fourni par les saisies et ajoute au bas du fichier:

declare module "moment" { export = moment; }

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

Dois-je créer mon propre fichier .d.ts pour l'instant ou puis-je manquer d'un élément de configuration?

68

Mettre à jour

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

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

Cela dit cependant, comme indiqué dans moment/pull/3319 # d'émission-commentaire-263752265 le moment où l'équipe semble avoir quelques problèmes pour maintenir ces définitions (ils cherchent toujours quelqu'un qui maintient leur).


Vous devez installer les typages moment sans l'indicateur --ambient.

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

85
Aides

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

J'ai trouvé une note dans la documentation TypeScript ici .

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

Ainsi, le code pour importer le moment js dans TypeScript se présente comme suit:

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

via des saisies

Moment.js prend désormais en charge TypeScript dans v2.14.1.

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


directement

Ce n'est peut-être pas la meilleure réponse, mais c'est la méthode de la force brute, et cela fonctionne pour moi.

  1. Il suffit de télécharger le fichier moment.js et de l’inclure 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:string):string {
        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 node pour exécuter main.js.
14
sivabudh

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

MISE À JOUR:

On dirait que le moment récent a corrigé leur importation. À partir d’au moins 2.24.0, vous souhaiterez utiliser import * as moment from 'moment';

11
NSjonas

1. moment d'installation

npm install moment --save

2. Testez ce code dans votre fichier TypeScript

import moment = require('moment');

console.log(moment().format('LLLL'));
1
hardy lutula