Как может момент.JS импортируется с помощью typescript?
Я пытаюсь выучить машинописный текст. Хотя я не думаю, что это важно, я использую VSCode для этой демонстрации.
у меня есть package.json
который имеет эти части в нем:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:moment@^2.12.0"
}
}
тогда у меня есть класс Typescript main.js
такой:
import moment from 'moment';
export class Main {
}
мой gulpfile.js
выглядит так:
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'));
});
когда я запускаю gulp build, я получаю сообщение:"../main.ts(1,25): Cannot file module 'moment'."
если я использую import moment = require('moment');
тогда jspm будет работать и приносить модуль, когда я запускаю приложение, но я все еще получаю ошибку сборки.
Я тоже попробовал:
npm install typings -g
typings install moment --ambient --save
вместо того, чтобы сделать проблему лучше, хотя, это стало хуже. Теперь я получаю вышеуказанную ошибку при сборке, а также следующее:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."
если я перейду к файлу, предоставленному typings и добавить в нижней части файла:
declare module "moment" { export = moment; }
Я могу получить вторую ошибку, чтобы уйти, но мне все еще нужен оператор require, чтобы получить момент для работы в моем main.ts
file и я все еще получаю первая ошибка сборки.
мне нужно создать свой собственный на мгновение или там просто кусок настройки я упускаю?
5 ответов
обновление
видимо сейчас дает свои определения типа (по данным sivabudh по крайней мере от 2.14.1 вверх), поэтому вам не нужно typings
или @types
на всех.
import * as moment from moment
следует загрузить определения типов, предоставленные пакетом npm.
что сказано однако, как сказано в момент / тянуть / 3319#issuecomment-263752265 у команды момента, похоже, есть некоторые проблемы в поддержании этих определения (они все еще ищут кого-то, кто их поддерживает).
вам нужно установить moment
typings без --ambient
флаг.
затем включите его, используя import * as moment from 'moment'
вам нужно импортировать момент() функции и момент класс отдельно в TS.
Я нашел заметку в TypeScript docs здесь.
/ * ~ обратите внимание, что модули ES6 не могут напрямую экспортировать вызываемые функции. * ~ Этот файл должен быть импортирован с помощью CommonJS-style: * ~ import x = require ('someLibrary');
таким образом, код для импорта момента js в typescript на самом деле выглядит так это:
import { Moment } from 'moment'
....
let moment = require('moment');
...
interface SomeTime {
aMoment: Moment,
}
...
fn() {
...
someTime.aMoment = moment(...);
...
}
через typings
момент.js теперь поддерживает TypeScript в v2.14.1.
см.:https://github.com/moment/moment/pull/3280
напрямую
возможно, это не лучший ответ, но это путь грубой силы, и он работает для меня.
- просто скачайте фактический
moment.js
file и включите его в свой проект. - например, мой проект выглядит так это:
$ 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
для выполненияmain.js
.
Не уверен, когда это изменилось, но с последней версией typescript вам просто нужно использовать import moment from 'moment';
и все остальное должно работать нормально.
1. установить момент
npm install moment --save
2. проверьте этот код в файле typescript
import moment = require('moment');
console.log(moment().format('LLLL'));