【发布时间】:2017-06-12 10:09:19
【问题描述】:
假设您有以下组件,该组件接受一个或多个子 JSX.Elements,并在使用 React.cloneElement(child, { onCancel: () => {} } 渲染它们时将额外的回调传递给它们的 props。
有问题的组件(摘录):
interface XComponentProps {
onCancel: (index: number) => void;
}
class XComponent extends React.Component<XComponentProps> {
render() {
const { onCancel } = this.props;
const children = typeof this.props.children === 'function' ?
React.cloneElement(this.props.children, { onCancel: () => onCancel() }) :
this.props.children.map((child, idx) => (
React.cloneElement(child, { onCancel: () => onCancel(idx) })
));
return <div>{children}</div>;
}
}
正在使用的相关组件(摘录):
interface UserComponentProps { caption: string }
const UserComponent = (props: UserComponentProps) => (
<button onClick={props.onClose}>{props.caption || "close"}</button>
);
ReactDOM.render(
<XComponent onCancel={handleCancel}>
<UserComponent />
<UserComponent />
<UserComponent />
</XComponent>
);
现在 TSC 抱怨 UserComponent 在其 props 的接口定义中没有 onCancel,实际上没有。一种最简单的解决方法是手动将onCancel 定义为UserComponentProps 接口。
但是,我想在不修改子节点的 prop 定义的情况下修复它,以便组件可以接受任意一组 React 元素。在这种情况下,有没有办法定义返回元素的类型,这些元素在XComponent(父)级别传递了额外的隐式道具?
【问题讨论】:
标签: javascript reactjs typescript typescript-typings