【发布时间】:2017-04-05 12:11:43
【问题描述】:
我想我无法理解这一点,我已经尝试了大概六次并且总是求助于any...一个组件,然后将其包装在另一个组件中,以便 HTML 道具通过所有内容?本质上是自定义 HTML 元素?例如,类似:
interface MyButtonProps extends React.HTMLProps<HTMLButtonElement> {}
class MyButton extends React.Component<MyButtonProps, {}> {
render() {
return <button/>;
}
}
interface MyAwesomeButtonProps extends MyButtonProps {}
class MyAwesomeButton extends React.Component<MyAwesomeButtonProps, {}> {
render() {
return <MyButton/>;
}
}
用法:
<MyAwesomeButton onClick={...}/>
每当我尝试这种组合时,都会收到类似于以下内容的错误:
foo 的属性 'ref' 不可分配给目标属性。
【问题讨论】:
-
您正在寻找高阶组件(组件工厂)。在网上检查一下,看看是否符合您的要求。它们本质上是“组件工厂”,允许您将组件包装在另一个组件中,该组件返回该初始组件,但带有新的或修改的道具。
-
错误是编译时间(编译时)?因为,我尝试使用
tsc命令编译您的代码并且工作正常。我试图渲染<MyAwesomeButton onClick={() => console.log('Clicked')}/> -
我注意到的一件事是,您不应该将 props 以
<button {...this.props} />的形式传递给您的原生 (HTML) 元素吗? -
此线程讨论了一些建议的答案github.com/DefinitelyTyped/DefinitelyTyped/issues/36505 的问题,并建议接口 Props 扩展 React.ComponentProps 以捕获任何丢失的道具。
-
我总是使用
React.ComponentsProps<"button">通用输入可以是任何东西,从反应组件到字符串,例如“div”。在使用或不使用 ref 转发时,还可以使用变体ComponentsPropsWithRef和ComponentsPropsWithoutRef。
标签: reactjs typescript tsx