Машинопись: как обезопасить патч `history.pushState` без использования ts-ignore? - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь реализовать history API-патч, как это делает библиотека маршрутизации wouter, но в Typescript вместо Javascript.

Библиотека wouter использует такой код:

["pushState", "replaceState"].map(type => {
  const original = history[type];

  history[type] = function() {
    const result = original.apply(this, arguments);
    const event = new Event(type);
    event.arguments = arguments;

    dispatchEvent(event);
    return result;
  };
});

который я адаптировал в Typescript:

type WindowHistoryFn =
  (data: any, title: string, url?: (string | null)) => void;

function patchHistoryPushState(){
  const original: WindowHistoryFn = window.history.pushState;

  window.history.pushState = function(data: any, title: string, url?: (string | null)): void{
    const result = original.apply(this, [data, title, url]);
    const event = new Event("pushState");
    // @ts-ignore
    event.arguments = arguments;

    dispatchEvent(event);
    return result;
  };
}

Кажется, это работает, но я не понимаю строку event.arguments = arguments.

Тип Event не имеет поля arguments. Есть ли другой тип Event, которым я должен заниматься? Как я могу переписать вышеуказанную функцию Typescript, чтобы не использовать ts-ignore?

1 Ответ

0 голосов
/ 29 января 2020

Так как JavaScript напечатан уткой, вы можете добавить все, что захотите. Но в мире TypeScript вам нужно создать собственный интерфейс, который расширен с Event или вы можете использовать CustomEvent. Если вы используете CustomEvent, вам нужно заполнить detail вместо arguments.

. Вы можете обратиться к https://developer.mozilla.org/en-US/docs/Web/API/Event

...