Предполагая, что у вас есть следующий компонент, который принимает один или несколько дочерних элементов JSX.Elements и передает дополнительный обратный вызов своим реквизитам, когда они отображаются с использованием React.cloneElement(child, { onCancel: () => {} }
.
Рассматриваемый компонент (отрывок):
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
не имеет onCancel
в определении интерфейса его реквизита, чего на самом деле нет. Самое простое решение - вручную определить интерфейс с onCancel
по UserComponentProps
.
Однако я хочу исправить это, не изменяя определение свойства дочернего узла, чтобы компонент мог принимать произвольный набор элементов React. В таком сценарии есть способ определить типизацию возвращаемых элементов, у которых есть дополнительные неявные реквизиты, переданные на уровне XComponent
(родительский)?