Estoy tratando de aprender Typecript. 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"
}
}
Entonces tengo una clase de TypeScript main.js
como esta:
import moment from 'moment';
export class Main {
}
Mi gulpfile.js
aspecto 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.ts
archivo 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
typings
o@types
en 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
moment
mecanografía sin la--ambient
bandera.Luego inclúyelo usando
import * as moment from 'moment'
fuente
--ambient
bandera 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!--ambient
bandera para todas las definiciones de TypeScript detypings
/DefinitelyTyped
pero lamoment
definició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.Moment
para mecanografiar.moment.Moment
interfaz directamente desde el espacio de nombresmoment
No 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.0
querrás usarimport * as moment from 'moment';
fuente
import * as moment from 'moment'
no funcionará con mecanografiado, peroimport moment from 'moment'
sí.esModuleInterop
conjuntotrue
en 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.js
archivo 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'));
node
para 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.0
y 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/moment
paquete delpackage.json
archivo y funcionó usando:import * as moment from 'moment'
Las versiones más recientes de
moment
no requieren el@types/moment
paquete, ya que los tipos ya están incluidos.fuente