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 正是最好用工具之一。

相关推荐
昭昭颂桉a1 小时前
TypeScript 前端的必修课,从 JS 到 TS
开发语言·前端·javascript·typescript
俩毛豆2 小时前
HarmonyOS7开发者公开招募
typescript
退休倒计时18 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
夕夕木各1 天前
探究 TypeScript 类型体操里的 Equal 和 IsAny
typescript·源码阅读
GuWenyue1 天前
10分钟搞定TodoList实战!从0搭建Bun+TS的RESTful接口服务
前端·typescript·bun
rising start1 天前
九、vue3 组件通信:全场景详解
前端·vue.js·typescript
向上的车轮1 天前
TypeORM 1.0 正式发布:新一代 Node.js ORM 框架全面解析
typescript·node.js·typeorm
ZengLiangYi2 天前
测试策略:单元测试 + 集成测试怎么写
javascript·typescript·node.js
颂love2 天前
Vue的两大生态以及组件通信
前端·javascript·vue.js·typescript
hhb_6182 天前
TypeScript泛型实战:企业级请求封装全解析
javascript·ubuntu·typescript