Можно ли расширить Date, перегрузив конструктор

Мои данные содержат даты, представленные в различных форматах, многие из которых не распознаются 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. Вероятно, лучше просто иметь эту функцию синтаксического анализа как статическую функцию и использовать ее таким образом; let newDate = new Date(safeDateParse(dateString)). Таким образом, не возникнет путаницы, когда кто-то еще прочитает ваш код.

Heretic Monkey 19.05.2018 17:28

Я согласен, но я рассматриваю проблему необходимости обновления существующего кода и постоянную проблему, заставляющую других программистов использовать нестандартную версию базовой команды.

MortimerCat 19.05.2018 18:56
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
2
200
3

Ответы 3

Думаю, вы можете перезаписать конструктор Date обычным способом:

window.Date = function (orig) {
  return function (...params) {
    // Do some custom stuff here
    return new orig(...params)
  }
}(Date)

«Свойство« Дата »не существует для типа« Окно »» или если я удалю окно, чтобы иметь функцию Date = .... Я получаю «Невозможно присвоить« Дата », потому что это константа или свойство, доступное только для чтения».

MortimerCat 19.05.2018 18:46

Используйте этот код как отправную точку:

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 (); перестал работать, так как это больше не определялось.

MortimerCat 19.05.2018 23:33

Для справки, мне так и не удалось перегрузить конструктор. Я обнаружил, что параметр использует DateConstructor для обработки различных перегрузок. Мое решение, если возможно, должно было бы справиться с этими перегрузками. В конце концов, я неохотно выбрал решение, приведенное ниже, и мне пришлось обучать других программистов использовать мой Utility.safeDate (), а не new Date ().

public static safeDate(dateAsString: string): Date {
    return new Date(safeDateParse(dateAsString));
}

и пример вызова.

const dateObject = Utility.safeDate('șapte mai 1983')

Другие вопросы по теме