Estoy tratando de aprender Typecript. Si bien no creo que sea relevante, estoy usando VSCode para esta demostración.
Tengo un package.jsonque tiene estas piezas:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:moment@^2.12.0"
}
}
Entonces tengo una clase de TypeScript main.jscomo esta:
import moment from 'moment';
export class Main {
}
Mi gulpfile.jsaspecto es 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, aparece el mensaje: "../main.ts(1,25): Cannot file module 'moment'."
Si uso import moment = require('moment');, jspm funcionará y traerá el módulo cuando ejecuto la aplicación, pero sigo recibiendo 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 obtengo 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 mecanografía y agrego en la parte inferior del archivo:
declare module "moment" { export = moment; }
Puedo hacer que el segundo error desaparezca, pero todavía necesito la declaración require para que el momento funcione en mi main.ts archivo y sigo recibiendo el primer error de compilación.
¿Necesito crear mi propio .d.tsarchivo por un momento o solo me falta alguna pieza de configuración?
fuente

import moment, { Moment } from 'moment';permite hacerloconst x = moment();yconst x: Moment = moment();Respuestas:
Actualizar
Aparentemente, moment ahora proporciona sus propias definiciones de tipo (de acuerdo con sivabudh al menos desde 2.14.1 en adelante ), por lo que no necesita
typingso@typesen absoluto.import * as moment from 'moment'debe cargar las definiciones de tipo proporcionadas con el paquete npm.Dicho esto, sin embargo, 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) .
Necesita instalar
momentmecanografía sin la--ambientbandera.Luego inclúyelo usando
import * as moment from 'moment'fuente
--ambientbandera y no? Conseguí que numeraljs funcionara usando la bandera ambiental. Además, su página principal npmjs.com/package/typings da el ejemplo usando la bandera ambiental. No sé cuándo querría / necesitaría usar uno sobre el otro. ¡Gracias!--ambientbandera para todas las definiciones de TypeScript detypings/DefinitelyTypedpero lamomentdefinición tiene una estructura extraña y los archivos no se descargan correctamente. Si observa el archivo de definición moment.d.ts , solo contiene una referencia a la versión del nodo, que no se resuelve en la descarga (podría valer la pena abrir un problema).Necesita importar moment () la función y Moment la clase por separado en TS.
Encontré una nota en los documentos mecanografiados aquí .
Entonces, el código para importar el momento js en mecanografiado en realidad se ve así:
import { Moment } from 'moment' .... let moment = require('moment'); ... interface SomeTime { aMoment: Moment, } ... fn() { ... someTime.aMoment = moment(...); ... }fuente
import * as moment from 'moment';y luego usarmoment.Momentpara mecanografiar.moment.Momentinterfaz directamente desde el espacio de nombresmomentNo estoy seguro de cuándo cambió esto, pero con la última versión de mecanografiado, solo necesita usar
import moment from 'moment';y todo lo demás debería funcionar normalmente.ACTUALIZAR:
Parece que el momento reciente corrigió su importación. Al menos
2.24.0querrás usarimport * as moment from 'moment';fuente
import * as moment from 'moment'no funcionará con mecanografiado, peroimport moment from 'moment'sí.esModuleInteropconjuntotrueen mi configuración, que obtuve de esta respuesta . Gracias.a través de mecanografía
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 la fuerza bruta, y funciona para mí.
moment.jsarchivo e inclúyalo en su proyecto.$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js''
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'));nodepara corrermain.js.fuente
Acabo de notar que la respuesta que voté y comenté es ambigua. Así que lo siguiente es exactamente lo que funcionó para mí. Actualmente estoy en Moment
2.26.0y TS3.8.3:En codigo:
import moment from 'moment';En la configuración de TS:
{ "compilerOptions": { "esModuleInterop": true, ... } }Estoy construyendo para ambos CommonJS y EMS por lo que esta configuración se importa en otros archivos de configuración.
La idea proviene de esta respuesta que se relaciona con el uso de Express. Sin embargo, pensé que valía la pena agregarlo aquí para ayudar a cualquiera que busque en relación con Moment.js, en lugar de algo más general.
fuente
moment()como de costumbre en lugar demoment.default()1. momento de instalación
2. pruebe este código en su archivo mecanografiado
import moment = require('moment'); console.log(moment().format('LLLL'));fuente
¿Aún roto? Intente desinstalar
@types/moment.Entonces, eliminé el
@types/momentpaquete delpackage.jsonarchivo y funcionó usando:import * as moment from 'moment'Las versiones más recientes de
momentno requieren el@types/momentpaquete, ya que los tipos ya están incluidos.fuente