在TypeScript中,可以通过使用联合类型和泛型来生成类型安全的联合类型表单函数。以下是一个实现的示例:
type FormField<T> = {
name: string;
value: T;
};
type FormFields = {
[key: string]: FormField<any>;
};
type FormValues<T> = {
[P in keyof T]: T[P]['value'];
};
function createForm<T extends FormFields>(fields: T) {
return {
fields,
getValues: (): FormValues<T> => {
const values: any = {};
for (const key in fields) {
values[key] = fields[key].value;
}
return values;
},
handleChange: <K extends keyof T>(name: K, value: T[K]['value']): void => {
fields[name].value = value;
},
handleSubmit: (callback: (values: FormValues<T>) => void): void => {
const values = this.getValues();
callback(values);
},
};
}
在上面的代码中,我们定义了FormField
接口,表示一个表单字段,包含了字段名name
和字段值value
。然后我们通过FormFields
类型定义了一个对象,以键值对的形式存储多个表单字段。
接下来,我们使用泛型T extends FormFields
来限定传入的表单字段对象的类型,并使用createForm
函数来创建表单。该函数接受一个fields
参数,类型为泛型T
,并返回一个表单对象。
表单对象中包含了以下几个方法:
getValues
方法用于获取当前表单的所有字段值,返回一个FormValues
对象,其中键名为字段名,键值为字段值。handleChange
方法用于更新某个字段的值。它接受两个参数,字段名name
和字段值value
,并通过泛型K extends keyof T
来限定字段名必须存在于表单字段对象中。handleSubmit
方法用于提交表单,它接受一个回调函数callback
,在提交时调用该回调函数并传递当前表单的所有字段值。使用示例:
const fields = {
username: { name: 'username', value: '' },
password: { name: 'password', value: '' },
};
const form = createForm(fields);
form.handleChange('username', 'John');
form.handleChange('password', '123456');
console.log(form.getValues()); // { username: 'John', password: '123456' }
form.handleSubmit((values) => {
console.log('Form submitted:', values);
});
这个例子展示了如何使用TypeScript生成类型安全的联合类型表单函数。注意,以上示例仅为演示目的,并未涉及具体的UI实现和表单验证。在实际应用中,您可能需要根据具体需求进行适当的调整和扩展。
腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云