Подтвердить что ты не робот

Как импортировать 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 за мгновение или есть только какая-то часть настройки, которую я не вижу?

4b9b3361

Ответ 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

  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.

Ответ 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'));