Ответ 1
import * as moment_ from 'moment';
const moment:moment.MomentStatic = (<any>moment_)['default'] || moment_;
Я пытаюсь использовать library.js-библиотеку внутри приложения Angular 2 Typescript. Даже после прочтения ответа на этот вопрос я не могу заставить его работать.
Это то, что я сделал до сих пор:
Я сконфигурировал System.js для извлечения библиотеки минут:
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
},
moment: {
main: 'moment.js',
type: 'cjs',
defaultExtension: 'js'
}
},
map: {
moment: 'node_modules/moment'
}
});
typings install moment-node --ambient --save
и typings install moment --ambient --save
, поэтому я вижу правильные пишущие черты внутри typings/main/ambient/moment- node и typings/main/ambient/momentТеперь, если в моем коде я использую import * as moment from 'moment';
Typescript, компиляция выполняется гладко, и я вижу правильное предложение внутри редактора Atom (если я начинаю с moment().
, я могу видеть year(), month() и т.д..). Однако, если я запустил свой код внутри браузера, он дает ошибку, говоря, что "момент не является функцией" (отладка я вижу, что момент - это объект с большим количеством методов).
Если я пишу import moment from 'moment';
, код в браузере отлично работает, однако компиляция Typescript не выполняется, поскольку "момент модуля не имеет экспорта по умолчанию", и я не могу получить никаких предложений от Atom при написании кода.
Что я делаю неправильно? Какой правильный способ импортировать файл moment.js(и любую библиотеку без Typescript) внутри приложения Angular 2 Typescript?
import * as moment_ from 'moment';
const moment:moment.MomentStatic = (<any>moment_)['default'] || moment_;
Как уже отмечалось, корабли с более ранними моделями теперь имеют свои собственные модели. И @ angular/cli также изменились. Обновленный ответ, чтобы отразить это.
npm я - период срабатывания
import * as moment from 'moment';
export class SomeClass implements OnInit {
date: moment.Moment;
ngOnInit() {
this.date = moment();
}
}
- это все, что необходимо для @ angular/cli.
Ниже мой старый устаревший ответ.
С angular -cli: Таким образом, вы получаете Intellisense в VsCode
edit → angular -cli-build.js
module.exports = function(defaults) {
return new Angular2App(defaults, {
vendorNpmFiles: [
...
'moment/min/**', // add this line
...
]
});
};
edit → system-config.ts
const map: any = {
moment: 'vendor/moment/min/moment.min.js' // add this line
};
В вашем компоненте:
import * as moment from 'moment';
...
// example of usage
dates: moment.Moment[] = [];
ngOnInit() {
let date = moment();
date.add(2, 'days');
this.dates.push(date);
}
Также я нашел следующее: Установите Moment.js с помощью NPM:
npm install moment
Добавьте его в конфигурацию SystemJS:
map: {
'angular2': 'node_modules/angular2',
'rxjs': 'node_modules/rxjs',
'moment': 'node_modules/moment/moment'
}
Вам также нужен интерфейс:
tsd install moment --save
а затем добавьте:
/// <reference path="typings/moment/moment.d.ts" />
import * as moment from 'moment';
Из вашего index.html add
<script src="../node_modules/moment/moment.js"></script>
В вашем компоненте используйте:
declare var moment: any;
...
this.startDate = moment().subtract(15, 'days').format('DD-MM-YYYY');
this.endDate = moment().format('DD-MM-YYYY');
При импорте модуля с использованием синтаксиса пространства имен для сбора экспорта на один объект, как и в import * as moment from 'moment'
, вы не импортируете фактический момент объекта, который экспортирует модуль, а скорее все его члены. Вы теряете подпись вызова. Чтобы решить эту проблему, в проекте SystemJS + TypeScript укажите либо значение "system" для модуля, либо значение true
для allowSyntheticDefaultImports, передав их компилятору TypeScript, предпочтительно через файл tsconfig.json
.
Затем импортируйте момент так
import moment from 'moment';
и все будет работать.