Я создаю компонент более высокого порядка, чтобы обернуть компонент, расширяющий интерфейс:
interface ClickOutsideInterface {
onClickOutside: (e: Event) => void
}
Созданная мной фабрика ожидает React.ComponentClass
реализации ClickOutsideInterface
:
function clickOutside<P>(Component: React.ComponentClass<P> & ClickOutsideInterface){
return class ClickOutside extends React.Component<P, {}> {
/* on click outside invoke Component.onClickOutside */
render() {
return(<div><Component {...this.props} /></div>)
}
}
}
Чтобы протестировать фабрику, я реализовал компонент, расширяющий ClickOutsideInterface
class Test extends React.Component<TProps, TState> implements ClickOutsideInterface {
onClickOutside(event: Event): void {
this.setState({
closed: true
})
}
render(){
return(
<div>{this.state.closed}</div>
)
}
}
Но когда я использую компонент в качестве аргумента в функции clickOutside
:
const withClickOutside = clickOutside(Test)
Я получаю следующую ошибку типа для аргумента Test
:
Аргумент типа typeof Test не может быть назначен параметру типа ComponentClass & ClickOutsideInterface. Тип typeof Test нельзя присвоить типу ClickOutsideInterface. Свойство onClickOutside отсутствует в типе typeof Test.
Есть идеи, почему Typescript считает, что я не реализую интерфейс в Test
?
withClickOutside()(Test)
- person Dmitriy Kovalenko   schedule 29.10.2017clickOutside
вернул функцию, которую можно было бы использовать в качестве декоратора. Это в любом случае не имело бы здесь смысла, потому что для этого не потребовалось бы никаких аргументов. - person Aluan Haddad   schedule 29.10.2017