Как может момент.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


напрямую

возможно, это не лучший ответ, но это путь грубой силы, и он работает для меня.

  1. просто скачайте фактический moment.js file и включите его в свой проект.
  2. например, мой проект выглядит так это:

$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js

  1. и вот пример исходного кода:

``

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'));
  1. просто использовать node для выполнения main.js.

Не уверен, когда это изменилось, но с последней версией typescript вам просто нужно использовать import moment from 'moment'; и все остальное должно работать нормально.


1. установить момент

npm install moment --save

2. проверьте этот код в файле typescript

import moment = require('moment');

console.log(moment().format('LLLL'));