Проверка типов параметров в Typescript

1

Я пытаюсь проверить тип моих параметров в компоненте 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?

  • 1
    Может быть проще зарегистрировать разные обработчики для событий мыши и клавиатуры, и тогда вам вообще не нужно будет включать тип события?
Теги:

2 ответа

2

Вы можете использовать свойство event.type. для более подробного объяснения просьба обращаться к этим документам SyntheticEvent

  • 0
    В сочетании с надписью это будет более ориентировано на машинопись, но, безусловно, это хороший способ проверить :)
  • 0
    я попытался, if(e.type === React.MouseEvent<HTMLElement>) но он выдает ошибку e.type === React.MouseEvent<HTMLElement>
Показать ещё 4 комментария
1

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
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню