【发布时间】:2020-11-19 22:27:13
【问题描述】:
我编写了一个名为withDefaults 的函数,它接受一个 React 组件(实际上是一个函数)并提供一个具有默认参数值的对象。它返回一个调用原始 React 组件(函数)并将默认参数与最终参数集合并的函数。
如果在默认集中提供了必需的参数,如何使它们不再需要?
function withDefaultProps<C extends React.ElementType>(Component: c) {
const ResultComponent = Component as React.FunctionComponent;
return (
(defaultProps: Partial<React.ComponentProps<C>>) => (
(finalProps: React.ComponentProps<C>) => (
<ResultComponent {...defaultProps} {...finalProps}>
{finalProps.children}
</ResultComponent>
)
)
)
}
例如,我有一个组件需要a 和b 作为属性。
type MyCompProps = {
a: string,
b: string
};
function MyComp(props: MyCompProps) {
return null; // My react structure here
}
const MyPrefilledComp = withDefaultProps(MyComp)({ a: 'alwaysThisString' });
这是 Typescript 错误出现的地方。当我尝试使用MyPrefilledComp 时,它仍然需要我提供a 属性,即使它有一个默认值。如何调整我的 withDefaulProps 方法以使其成为可选,而不使所有属性成为可选。我已经尝试使用 keyOf 进行 Diff 和 Omit,但我的 Typescript 非常初级,所以我可能做错了。
// Typescript error: Property a is required
function MyApp() {
return (
<MyPrefilledComp b="a non default value" />
)
}
我已尝试对其进行简化,并且可以轻松查看问题出在哪里,但我不确定如何解决它。类似于:Omit<OriginalProps, Partial<OriginalProps>>,但该部分会根据调用被赋予动态类型。
function withDefaults(defaultProps: Partial<OriginalProps>) {
return function wrapper(finalProps: OriginalProps) {
return {
...defaultProps,
...finalProps
};
}
}
【问题讨论】:
标签: reactjs typescript