Я определил интерфейс для обработчиков событий компонента реагирования:
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>'.
Итак, вопрос, возможно ли работать с индексируемыми типами, которые одновременно поддерживают перегруженные функции?