Если ни одно из вышеперечисленных решений не работает (ничего не работает для меня), то просто RESTART ваш компьютер, и вы сможете подключиться к вашему серверу sql (localhost).
Устаревшая обратная перегрузка add(unit: unitOfTime.DurationConstructor, amount: number|string)
создает неоднозначность.
Вы можете исправить это, указав тип units
как DurationConstructor
вместо string
:
let units:moment.unitOfTime.DurationConstructor = 'month';
moment().add(1, units);
Другим вариантом принятого ответа является приведение аргументов в тип. Нет никакой разницы, просто подумал, что я включу этот ответ в качестве опции. Кроме того, 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 )
В моем случае проблема заключалась в том, что я использовал 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
Эта проблема вызвана устаревшим обратным синтаксисом функций 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
}
DurationConstructor
является объединением типов строковых литералов (например,type Foo = 'month' | 'week' | ...
), это препятствует вам передавать недействительные / не поддерживаемые строки в качестве параметра единицы. Поэтому вам лучше заменить подпись функции наaddOneUnit(date: Date, units:moment.unitOfTime.DurationConstructor)
. Другой вариант - использовать утверждение типа (units as moment.unitOfTime.DurationConstructor
), но вы потеряете безопасность типа. – Aleksey L. 25 January 2017 в 07:44