Набор текста на Typescript для momentjs и moment-range не работает вместе

#momentjs #typescript-typings

#momentjs #набор текста на typescript

Вопрос:

Я использую momentjs и moment-range с Typescript, поэтому у меня есть набор текста для moment-range from npm @types , и набор текста для momentjs поставляется вместе с ним.

 import * as moment from 'moment';
import 'moment-range';
...
private tableDatePeriod: moment.Range;
  

но при компиляции я получаю эту ошибку — [ts] Module 'moment' has no exported member 'Range'.

Ответ №1:

Попробуйте это

 import * as moment from 'moment';
import { default as DateRange } from 'moment-range';

let Range=new DateRange(dayFrom, dayTo);
Range.toArray('days');

let DatesArray=[];
diffDatesArray.push(moment(some_prop_from_array._d).format("YYYY-MM-DD"));
  

Комментарии:

1. это полезно, но с предыдущей версией moment и moment-range

2. для меня это работает для версий "moment": "^2.16.0", "moment-range": "^2.2.0"

Ответ №2:

Для версий у меня работает следующее:

  • момент: 2.17.1
  • moment-range: 2.2.0
  • @types/moment-range: 2.0.33

Проблема в том, что moment-range.js не экспортируется никакой новый объект для функциональности диапазона, он расширяет moment тип функциональными возможностями диапазона. Поэтому эти функциональные возможности должны быть импортированы из moment .

 import {Moment, Range, range as RangeConstructor} from "moment";
  

Этот импорт загружает moment-range функциональные возможности из moment . В этом примере я импортирую Range интерфейс и range фабричный метод (для создания / конструирования диапазонов).
Этого должно быть достаточно, но в случае, если вы используете какой-либо тип AMD или аналогичную зависимость, moment-range модуль должен быть загружен (требуется с использованием терминов AMD).
Ниже приведен хак, который работает у меня:

 import DateRange = require("moment-range");
DateRange;
  

Первый импорт включает moment-range модуль как зависимость от текущего модуля, поэтому он загружается по мере необходимости первым.
Вторая строка ничего не делает, но компилятор TypeScript удаляет неиспользуемые зависимости, поэтому прежняя импортированная зависимость должна быть каким-то образом вызвана, чтобы избежать такой оптимизации компилятора.

В связи с вашим вопросом, теперь вы можете создать экземпляр переменной:

 private tableDatePeriod: Range;
  

И инициализировать:

 tableDatePeriod = RangeConstructor('2016-01-09', '2016-01-10');