【发布时间】:2017-10-29 15:14:37
【问题描述】:
我正在创建一个高阶组件来包装一个扩展接口的组件:
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”类型的参数不能分配给类型参数 “组件类和 ClickOutsideInterface”。类型'typeof Test'是 不可分配给类型“ClickOutsideInterface”。 “typeof Test”类型中缺少属性“onClickOutside”。
任何想法为什么 Typescript 认为我没有在 Test 中实现接口?
【问题讨论】:
-
不是装饰器?
withClickOutside()(Test) -
可能是的:)
-
@DmitriyKovalenko 装饰器与否,如果此函数是装饰器,您建议的调用将不正确,因为它是装饰器工厂调用而不是装饰器调用。仅当
clickOutside返回一个可用作装饰器的函数时才有效。无论如何,这在这里没有意义,因为它不需要任何参数。
标签: reactjs typescript higher-order-components