Индексируемый тип с перегруженными функциями - PullRequest
0 голосов
/ 17 февраля 2020

Я определил интерфейс для обработчиков событий компонента реагирования:

interface IDictEventHandlers {
  [index: string]: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
}

Это прекрасно работает для создания таких объектов, как:

const handleFoo = (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
  console.log("foo");
}

const handleBar = (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
  console.log("bar");
}

const myEventHandlers: IDictEventHandler = {
  foo: handleFoo,
  bar: handleBar,
}

<...html which sends events/>

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

interface IDictEventHandlers {
  [index: string]: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | string) => void;
}

const handleFoo = (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
  console.log("foo");
}

const handleBar = (e: string) => {
  console.log(e);
}

const myEventHandlers: IDictEventHandler = {
  foo: handleFoo,
  bar: handleBar,
}

<...html which sends events/>

, я получаю ошибку компиляции:

Type '(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void' is not assignable to type '(e: string | ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void'.
  Types of parameters 'e' and 'e' are incompatible.
    Type 'string | ChangeEvent<HTMLInputElement | HTMLTextAreaElement>' is not assignable to type 'ChangeEvent<HTMLInputElement | HTMLTextAreaElement>'.
      Type 'string' is not assignable to type 'ChangeEvent<HTMLInputElement | HTMLTextAreaElement>'.

Итак, вопрос, возможно ли работать с индексируемыми типами, которые одновременно поддерживают перегруженные функции?

...