我正在使用typescript编写React函数组件。为了在提交数据之前对其进行格式化,我希望创建一个表单组件,该组件可以选择具有format
函数和FormattedValue
泛型类型。
但是,它不应该允许您在没有设置泛型类型的情况下使用format
,否则您可能会意外地提交错误类型的表单。
我不知道如何使一个函数重载,使Form
函数要么有通用的FormattedValue
集和format
参数,要么没有。
这是我尝试做的一个最小的例子:
import {Form} from "../components/Form"
type FormProps<Value> = {
submit: (data: Value) => void;
}
type FormattedFormProps<Value, FormattedValue> = {
submit: (data: FormattedValue) => void;
format: (value: Value) => FormattedValue
}
function GenericForm<V>({submit}: FormProps<V>): ReactNode;
function GenericForm<V,F>({submit, format}: FormattedFormProps<V, F>) {
return (
<Form
//...
onSubmit={(value) => {
submit(format ? format(value) : value)
}}
>
// ...
</Form>
)
}
export default GenericForm
这会产生错误:This overload signature is not compatible with its implementation signature.(2394)
.
我希望避免为普通窗体和带格式的窗体创建单独的组件。
1条答案
按热度按时间xu3bshqb1#
但是,它不应该允许您在没有设置泛型类型的情况下使用
format
,否则您可能会意外地提交错误类型的表单。我不同意这种说法,因为
FormattedFormProps
将确保format
的输出是submit
的输入。如果出于某种原因,您希望限制必须用于在调用站点上格式化和提交的类型,则可以创建
GenericForm
的变体,而无需重新实现它,如下所示: