Я пытаюсь изучить Машинопись. Хотя я не думаю, что это актуально, я использую 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'."
Если я перейду к файлу, предоставленному набором символов, и добавлю внизу файла:
declare module "moment" { export = moment; }
Я могу заставить вторую ошибку исчезнуть, но мне все еще нужен оператор require, чтобы получить момент для работы с моим main.ts
файлом, и я все еще получаю первую ошибку сборки.
Мне нужно создать свой собственный .d.ts
файл на данный момент или мне не хватает какой-то части настройки?
источник
import moment, { Moment } from 'moment';
const x = moment();
const x: Moment = moment();
Ответы:
Обновить
Судя по всему, момент теперь предоставляет свои собственные определения типов (согласно sivabudh по крайней мере с 2.14.1 и выше), поэтому они вам не нужны
typings
или вообще не нужны@types
.import * as moment from 'moment'
должен загрузить определения типов, предоставленные в пакете npm.При этом, однако, как сказано в moment / pull / 3319 # issuecomment-263752265, у команды, похоже, есть некоторые проблемы с поддержанием этих определений (они все еще ищут того, кто их поддерживает) .
Вам нужно установить
moment
типизацию без--ambient
флага.Затем включите его, используя
import * as moment from 'moment'
источник
--ambient
флага и его использованием? Я получил numeraljs для работы с окружающим флагом. Кроме того, на их главной странице npmjs.com/package/typings приводится пример с использованием флага окружения. Я не знаю, когда мне нужно / нужно использовать одно вместо другого. Благодарность!--ambient
флаг для всех определений Typescript изtypings
/,DefinitelyTyped
ноmoment
определение имеет странную структуру, и файлы загружаются неправильно. Если вы посмотрите на файл определения moment.d.ts, он содержит только ссылку на версию узла, которая не разрешается при загрузке (возможно, стоит открыть проблему).Вам необходимо отдельно импортировать функцию moment () и класс Moment в TS.
Я нашел заметку в документах машинописного текста здесь .
Таким образом, код для импорта моментальных js в машинописный текст на самом деле выглядит так:
import { Moment } from 'moment' .... let moment = require('moment'); ... interface SomeTime { aMoment: Moment, } ... fn() { ... someTime.aMoment = moment(...); ... }
источник
import * as moment from 'moment';
а затем использоватьmoment.Moment
для набора текста.moment.Moment
интерфейс непосредственно из пространства именmoment
Не уверен, когда это изменилось, но с последней версией машинописного текста вам просто нужно использовать,
import moment from 'moment';
а все остальное должно работать как обычно.ОБНОВИТЬ:
Похоже, недавний момент исправил их импорт. По крайней мере,
2.24.0
вы захотите использоватьimport * as moment from 'moment';
источник
import * as moment from 'moment'
не будет работать с машинописным текстом, ноimport moment from 'moment'
работает.esModuleInterop
наборtrue
в мою конфигурацию, что я получил из этого ответа . Спасибо.через набор текста
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
.источник
Я только что заметил, что ответ, за который я проголосовал и прокомментировал, неоднозначен. Так что у меня сработало именно следующее. Сейчас я использую Moment
2.26.0
и TS3.8.3
:В коде:
import moment from 'moment';
В конфигурации TS:
{ "compilerOptions": { "esModuleInterop": true, ... } }
Я создаю как для CommonJS, так и для EMS, поэтому эта конфигурация импортируется в другие файлы конфигурации.
Понимание приходит из этого ответа, который относится к использованию Express. Я решил, что это стоит добавить сюда, чтобы помочь любому, кто ищет в отношении Moment.js, а не что-то более общее.
источник
moment()
как обычно вместоmoment.default()
1. момент установки
2. протестируйте этот код в своем машинописном файле.
import moment = require('moment'); console.log(moment().format('LLLL'));
источник
Все еще не работает? Попробуйте удалить
@types/moment
.Итак, я удалил
@types/moment
пакет изpackage.json
файла, и он работал с использованием:import * as moment from 'moment'
Более новые версии
moment
не требуют@types/moment
пакета, так как типы уже включены.источник