Я пытаюсь проверить тип моих параметров в компоненте React/Typcript
foo(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) {
if(e is mouse event) {
//do something
}
else if (e is KeyboardEvent) {
//do something else
}
}
Как я могу написать условия if/else?
Вы можете использовать свойство event.type. для более подробного объяснения просьба обращаться к этим документам SyntheticEvent
if(e.type === React.MouseEvent<HTMLElement>)
но он выдает ошибку e.type === React.MouseEvent<HTMLElement>
React.MouseEvent
и React.KeyboardEvent
определены как интерфейсы, и, таким образом, для этих типов нет представления во время выполнения. Мы можем создать тип-хранитель, чтобы различать типы, и мы можем использовать свойства, определенные на объекте, фактически проверять, соответствует ли объект интерфейсу:
function isMouseEvent<T>(e: any | React.MouseEvent<T>) : e is React.MouseEvent<T> {
let eMouse = e as React.MouseEvent<T>;
// Can test for other properties as well
return eMouse && typeof eMouse.pageX === "number" && typeof eMouse.pageY === "number"
}
function isKeyboardEvent<T>(e: any | React.KeyboardEvent<T>) : e is React.KeyboardEvent<T> {
let eKey= e as React.KeyboardEvent<T>;
// Can test for other properties as well
return eKey&& typeof eKey.charCode === "number" && typeof eKey.key === "string"
}
function foo(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) {
if(isMouseEvent(e)) {
e // will be React.MouseEvent<HTMLElement>
}
else {
e // will be React.KeyboardEvent<HTMLElement> by exclusion, or we could use the other type guard
}
}