Как импортировать time.js с помощью typescript?
Я пытаюсь узнать Typescript. Хотя я не считаю это актуальным, я использую VSCode для этой демонстрации.
У меня есть package.json
, в котором есть эти фрагменты:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:[email protected]^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'."
Если я перейду к файлу, предоставленному типом и добавлю в нижней части файла:
declare module "moment" { export = moment; }
Я могу получить вторую ошибку, чтобы уйти, но мне все еще требуется инструкция require, чтобы получить момент для работы в моем файле main.ts
, и я все еще получаю первую ошибку сборки.
Мне нужно создать мой собственный файл .d.ts
за мгновение или есть только какая-то часть настройки, которую я не вижу?
Ответы
Ответ 1
Обновить
По всей видимости, теперь у момента есть свои собственные определения типов (в соответствии с sivabudh, по крайней мере, начиная с версии 2.14.1 и выше), поэтому вам вообще не нужны typings
или @types
.
import * as moment from 'moment'
должен загрузить определения типов, предоставленные пакетом npm.
Тем не менее, как сказано в момент/pull/3319 # issuecomment-263752265, в данный момент у команды, похоже, есть некоторые проблемы с поддержанием этих определений (они все еще ищут того, кто их поддерживает).
Вам нужно установить moment
набора без флага --ambient
.
Затем включите его, используя import * as moment from 'moment'
Ответ 2
Вам нужно импортировать момент() функцию и класс Момент отдельно в TS.
Я нашел заметку в документах по машинописи здесь.
/* ~ Обратите внимание, что модули ES6 не могут напрямую экспортировать вызываемые функции
* ~ Этот файл должен быть импортирован в стиле CommonJS:
* ~ import x = require ('someLibrary');
Таким образом, код для импорта момента js в машинописный текст выглядит следующим образом:
import { Moment } from 'moment'
....
let moment = require('moment');
...
interface SomeTime {
aMoment: Moment,
}
...
fn() {
...
someTime.aMoment = moment(...);
...
}
Ответ 3
через типизацию
Moment.js теперь поддерживает TypeScript в v2.14.1.
Смотрите: https://github.com/moment/moment/pull/3280
Непосредственно
Возможно, это не лучший ответ, но это метод грубой силы, и он работает для меня.
- Просто загрузите фактический файл
moment.js
и включите его в свой проект.
- Например, мой проект выглядит следующим образом:
$ 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
.
Ответ 4
Не уверен, когда это изменилось, но с последней версией машинописного текста вам просто нужно использовать import moment from 'moment';
а все остальное должно работать как обычно.
ОБНОВИТЬ:
Похоже, в последнее время исправлен их импорт. Начиная с 2.24.0
вы можете использовать import * as moment from 'moment';
Ответ 5
1. установить момент
npm install moment --save
2. протестируйте этот код в вашем машинописном файле
import moment = require('moment');
console.log(moment().format('LLLL'));