ts2304 name moment examples error cannot typescript momentjs jspm

typescript - name - ¿Cómo se puede importar moment.js con mecanografiado?



moment typescript (5)

Debe importar momentáneamente () la función y Momentar la clase por separado en TS.

Encontré una nota en los documentos mecanografiados here .

/ * ~ Tenga en cuenta que los módulos ES6 no pueden exportar directamente funciones invocables. * ~ Este archivo debe importarse utilizando el estilo CommonJS: * ~ import x = require (''someLibrary'');

Entonces el código para importar moment js en mecanografiado en realidad se ve así:

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

Estoy tratando de aprender mecanografiado. Si bien no creo que sea relevante, estoy usando VSCode para esta demostración.

Tengo un package.json que tiene estas piezas:

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

Luego tengo una clase main.js como esta:

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

Mi gulpfile.js ve así:

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'')); });

Cuando ejecuto gulp build, recibo el mensaje: "../main.ts(1,25): Cannot file module ''moment''."

Si uso import moment = require(''moment''); entonces jspm funcionará y traerá el módulo cuando ejecuto la aplicación, pero aún recibo el error de compilación. También probé:

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

Sin embargo, en lugar de mejorar el problema, empeoró. Ahora "../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace ''moment''." el error anterior en la compilación, así como lo siguiente: "../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace ''moment''."

Si voy al archivo provisto por tipings y agrego al final del archivo:

declare module "moment" { export = moment; }

Puedo obtener el segundo error para que desaparezca, pero todavía necesito la declaración require para tener un momento para trabajar en mi archivo main.ts y todavía main.ts el primer error de compilación.

¿Necesito crear mi propio archivo .d.ts por el momento o me falta algo de configuración?


No estoy seguro de cuándo cambió esto, pero con la última versión del mecanografiado, solo necesita usar import moment from ''moment''; y todo lo demás debería funcionar normalmente.

ACTUALIZAR:

Parece que el momento reciente arregló su importación. A partir de al menos 2.24.0 , querrá usar import * as moment from ''moment'';


1. momento de instalación

npm install moment --save

2. prueba este código en tu archivo mecanografiado

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


a través de tipings

Moment.js ahora es compatible con TypeScript en v2.14.1.

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

Directamente

Puede que no sea la mejor respuesta, pero esta es la forma de fuerza bruta, y funciona para mí.

  1. Simplemente descargue el archivo moment.js real e moment.js en su proyecto.
  2. Por ejemplo, mi proyecto se ve así:

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

  1. Y aquí hay un código fuente de muestra:

`` `

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. Simplemente use el node para ejecutar main.js

Actualizar

Aparentemente, moment ahora proporciona sus propias definiciones de tipo (de acuerdo con sivabudh al menos desde sivabudh en sivabudh ), por lo que no necesita typings o @types en absoluto.

import * as moment from ''moment'' debería cargar las definiciones de tipo proporcionadas con el paquete npm.

Sin embargo, dicho esto, como se dijo en moment/pull/3319#issuecomment-263752265 el equipo de momento parece tener algunos problemas para mantener esas definiciones (todavía están buscando a alguien que las mantenga) .

Debe instalar tipings de moment sin la bandera --ambient .

Luego inclúyalo usando import * as moment from ''moment''