Мои данные содержат даты, представленные в различных форматах, многие из которых не распознаются Typescript. Я создал функцию safeDateParse, которая обеспечивает расширенные преобразования, и перегрузил метод Date.parse ().
/** My overload */
Date.parse = function parse(dateAsString: string) {
return safeDateParse(dateAsString).valueOf();
};
Это работает, когда я создаю объект Date, используя следующий синтаксис.
const lastUsedDate = new Date(Date.parse(lastUsed));
Я также хотел бы перегрузить конструктор, чтобы использовать следующий синтаксис.
let newDate = new Date(dateString);
Мои лучшие усилия до сих пор
function Date(dateAsString: string): Date {
return safeDateParse(dateAsString);
}
Это не работает. Он заменяет класс Date, но не расширяет его. Я считаю, что в нем должна быть какая-то форма «супер» или «родительского» вызова, который обеспечивает остальную часть объекта Date.
Можно ли переопределить конструктор, и если да, то каков синтаксис?
Я согласен, но я рассматриваю проблему необходимости обновления существующего кода и постоянную проблему, заставляющую других программистов использовать нестандартную версию базовой команды.





Думаю, вы можете перезаписать конструктор Date обычным способом:
window.Date = function (orig) {
return function (...params) {
// Do some custom stuff here
return new orig(...params)
}
}(Date)
«Свойство« Дата »не существует для типа« Окно »» или если я удалю окно, чтобы иметь функцию Date = .... Я получаю «Невозможно присвоить« Дата », потому что это константа или свойство, доступное только для чтения».
Используйте этот код как отправную точку:
Date.parse = function parse(dateAsString: string) {
console.info('Overrided parse :)');
return safeDateParse(dateAsString).valueOf();
};
class MyDate extends Date {
constructor(dateAsString: string) {
console.info('extended Date');
const d = Date.parse(dateAsString);
super(d);
}
}
window['Date'] = MyDate;
new Date();
// logs :
// extended Date
// Overrided parse :)
Это выглядело обнадеживающе, но я столкнулся с проблемами, описанными здесь stackoverflow.com/questions/39415970/… Также возникли проблемы с перегрузкой конструктора, то есть const d = new Date (); перестал работать, так как это больше не определялось.
Для справки, мне так и не удалось перегрузить конструктор. Я обнаружил, что параметр использует DateConstructor для обработки различных перегрузок. Мое решение, если возможно, должно было бы справиться с этими перегрузками. В конце концов, я неохотно выбрал решение, приведенное ниже, и мне пришлось обучать других программистов использовать мой Utility.safeDate (), а не new Date ().
public static safeDate(dateAsString: string): Date {
return new Date(safeDateParse(dateAsString));
}
и пример вызова.
const dateObject = Utility.safeDate('șapte mai 1983')
Всегда рискованно перегружать встроенные объекты, такие как Date. Вероятно, лучше просто иметь эту функцию синтаксического анализа как статическую функцию и использовать ее таким образом;
let newDate = new Date(safeDateParse(dateString)). Таким образом, не возникнет путаницы, когда кто-то еще прочитает ваш код.