Вычитание даты в Angular using moment.js жалуется на типы [duplicate]

Если ни одно из вышеперечисленных решений не работает (ничего не работает для меня), то просто RESTART ваш компьютер, и вы сможете подключиться к вашему серверу sql (localhost).

12
задан rocklobster 20 January 2017 в 18:04
поделиться

6 ответов

Устаревшая обратная перегрузка add(unit: unitOfTime.DurationConstructor, amount: number|string) создает неоднозначность.

Вы можете исправить это, указав тип units как DurationConstructor вместо string:

let units:moment.unitOfTime.DurationConstructor = 'month';
moment().add(1, units);
8
ответ дан Aleksey L. 17 August 2018 в 20:59
поделиться
  • 1
    Ваш пример работает, но как я могу присвоить значение переменной типа переменной типа? Например, если у меня есть функция, которая принимает единицы в виде строки и хочет передать ее в момент (). Add ()? Что-то вроде этого: `function addOneUnit (date: Date, units: string) {let m = moment (date); return m.add (1, единиц); – rocklobster 24 January 2017 в 16:54
  • 2
    DurationConstructor является объединением типов строковых литералов (например, type Foo = 'month' | 'week' | ...), это препятствует вам передавать недействительные / не поддерживаемые строки в качестве параметра единицы. Поэтому вам лучше заменить подпись функции на addOneUnit(date: Date, units:moment.unitOfTime.DurationConstructor). Другой вариант - использовать утверждение типа (units as moment.unitOfTime.DurationConstructor), но вы потеряете безопасность типа. – Aleksey L. 25 January 2017 в 07:44

Другим вариантом принятого ответа является приведение аргументов в тип. Нет никакой разницы, просто подумал, что я включу этот ответ в качестве опции. Кроме того, unitOfTime может быть импортировано с момента в виде модуля, если вы хотите немного более кратко.

import { unitOfTime } from 'moment';
import * as moment from 'moment';

option = {val: 30, unit: 'm'}
moment().add( this.querySince.val, <unitOfTime.DurationConstructor>this.querySince.unit )
0
ответ дан Alex Spera 17 August 2018 в 20:59
поделиться

В моем случае проблема заключалась в том, что я использовал mins. Тип def для DurationConstructor -

namespace unitOfTime {
type Base = (
  "year" | "years" | "y" |
  "month" | "months" | "M" |
  "week" | "weeks" | "w" |
  "day" | "days" | "d" |
  "hour" | "hours" | "h" |
  "minute" | "minutes" | "m" |
  "second" | "seconds" | "s" |
  "millisecond" | "milliseconds" | "ms"
);

Итак, это работает из коробки:

refTime.clone().subtract(15, 'minute')

-k

0
ответ дан kontinuity 17 August 2018 в 20:59
поделиться

Эта проблема вызвана устаревшим обратным синтаксисом функций add, subtract и т. д. в библиотеке моментов. Ниже приведен фрагмент:

moment.d.ts

add(amount?: DurationInputArg1, unit?: DurationInputArg2): Moment;
/**
 * @deprecated reverse syntax
 */
add(unit: unitOfTime.DurationConstructor, amount: number|string): Moment;

В моем случае я хотел, чтобы единицы и значение были переменными, поэтому мне пришлось написать функцию для преобразования general в приемлемые («часы», «минуты» и т. д.).

function convertToDuration (unit: string): Moment.unitOfTime.DurationConstructor {

if(unit ==  'seconds' || unit ==  'minutes' || unit ==  'hours' || unit ==  'days' || unit ==  'weeks' || unit ==  'months'){
    return unit;
}
else // Default unit is hours
    return 'hours';
}

Теперь для вызова этой функции:

const time = moment().add(expiryTime.value, convertToDuration(expiryTime.unit));

Определение expiryTime в Тип:

interface ExpiryTimeDef {
value: number,
unit: string
}
0
ответ дан rahuljain1311 17 August 2018 в 20:59
поделиться
0
ответ дан Nikita 6 September 2018 в 13:29
поделиться
2
ответ дан Nikita 29 October 2018 в 19:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: