TypeScript 系列:类型更安全的 antd `useForm`

🤔 问题

今天遇到一个 bug,大概是这样一个 Antd 的搜索表单,点击重置其他下拉框都可以清空,唯独"请选择用户"无法清空。

Bug 代码如下:

tsx 复制代码
const handleReset = () => {
    history.push({ search: '' });

    form.setFieldValue('modelId', undefined);
    form.setFieldValue('useId', undefined);
    form.setFieldValue('apiKeyId', undefined);

    handleSearch(form.getFieldsValue());
};

🕵️‍♂️ 调试了较长时间,发现是拼写问题 userId ✅ 而非 useId ❌!归根结底是 form.setFieldValue 类型不够安全。为了避免将来再出现类似"低级"问题,重写该函数。

🔧 解决

tsx 复制代码
// hooks/useForm.ts
import { Form, FormInstance } from 'antd';

export function useForm<Values>() {
  const [form] = Form.useForm<Values>();

  return {
    ...form,
    setFieldValue<K extends keyof Values>(name: K, value: Values[K]) {
      return form.setFieldValue(name as string, value);
    },
  };
}

useFormsetFieldValue 的入参做了强类型校验,如果传入非预期字段将报错,从而规避书写错误。

使用:

假设我们表单类型如下

ts 复制代码
type IFormValues = {
  userId?: number;
  apiKeyId?: number;
  modelId?: number;
};

调用处只需修改一行换成我们实现的 useForm 即可。

tsx 复制代码
// const [form] = Form.useForm<IFormValues>();
const form = useForm<IFormValues>();

现在我们试一试:

ts 复制代码
form.setFieldValue('useId', undefined);

类型""useId""的参数不能赋给类型"keyof IFormValues"的参数。ts(2345)

🌌 总结

修复 bug 不是终点,我们需要想着如何通过工具避免才是正道。TS 正是最好用工具之一。

相关推荐
CRPER3 小时前
告别繁琐配置:一个现代化的 TypeScript 库开发模板,让你高效启动项目!
前端·typescript·node.js
BillKu1 天前
Vue3 + TypeScript + Element Plus 表格行按钮不触发 row-click 事件、不触发勾选行,只执行按钮的 click 事件
vue.js·elementui·typescript
霸王蟹1 天前
前端项目Excel数据导出同时出现中英文表头错乱情况解决方案。
笔记·学习·typescript·excel·vue3·react·vite
半醉看夕阳1 天前
HarmonyOS开发 ArkTS 之 var 、let、const 变量声明的剖析
typescript·harmonyos·arkts
BillKu1 天前
Vue3 + TypeScript 操作第三方库(Element Plus 的 ElTable)的内部属性
前端·javascript·typescript
好了来看下一题1 天前
TypeScript 项目配置
前端·javascript·typescript
霸王蟹1 天前
带你手写React中的useReducer函数。(底层实现)
前端·javascript·笔记·学习·react.js·typescript·前端框架
码农之王1 天前
(二)TypeScript前置编译配置
前端·后端·typescript
Raink老师1 天前
7. TypeScript接口
javascript·typescript
涵信2 天前
第一节 基础核心概念-TypeScript与JavaScript的核心区别
前端·javascript·typescript