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í.
-
Simplemente descargue el archivo
moment.js
real emoment.js
en su proyecto. - Por ejemplo, mi proyecto se ve así:
$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js
- 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''));
-
Simplemente use el
node
para ejecutarmain.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''