首页 > 其他分享 >用强数据类型保护你的表单数据-基于antd表单的类型约束

用强数据类型保护你的表单数据-基于antd表单的类型约束

时间:2023-11-15 16:22:24浏览次数:31  
标签:用强 name 数据类型 rule 表单 FormValue 类型

概述

接口数据类型与表单提交数据类型,在大多数情况下,大部分属性的类型是相同的,但很少能做到完全统一。

我在之前的工作中经常为了方便,直接将接口数据类型复用为表单内数据类型,在遇到属性类型不一致的情况时会使用any强制忽略类型错误。

后来经过自省与思考,这种工作模式会引起各种隐藏bug,一定有更好的工程解决方案。

我的答案就是:为表单提交数据单独定义类型!

类型解说

接口定义的请求体类型

请求数据类型

type RequestBody = {
   name?: string
   count?: number
   groupIds?: number[]
   startDate?: string // YYYY-MM-DD
}


表单提交数据类型定义

type FormValue = {
  name?: string
  count?: number
  groupIds?: string
  startDate?: Moment
}


有了该类型,我们可以方便的将该类型使用在表单实例上

const [form] = Form.useForm< FormValue >()


类型复用优化

如果表单的数据类型和接口提交的数据类型完全一致,当然可以共用一个,但现实世界这种情况几乎没有。

大多数情况是可以复用一些接口的属性到表单的数据类型中,例如上面的两个数据结构,其中 name、id 属性是相同的,则FormValue 可以优化为

type FormValue = Pick< RequestBody, 'name' | 'count' > {
  groupIds?: string
  startDate?: Moment
}


Form.Item 限定 name 优化

应用此时表单组件的name约束就应为我们自定义的表单数据类型FormValue,定义约束组件

const FormItem = Form.Item as React.FC<
  Omit< FormItemProps, 'name' > & {
    name: keyof FormValue
  }
>


应用该约束组件

< FormItem label="名称" name="name" > ...


数据转换

在表单的onFinish提交过程中,需要一个将FormValue(表单数据)转换为RequestBody(提交数据)的函数,类型定义如下:

const formValueToRquestBody = (values: FormValue): RequestBody => {
  return {
    name: values.name,
    id: values.id,
    groupIds: values.groupIds.split(',').map(n => Number(n)),
    startDate: values.startDate?.format('YYYY-MM-DD'),
  }
}


复杂表单类型

复杂表单有些表单数据并非一层的key => value,而是多层树状或数组结构。

例如:提交数据结构

type FormValue = {
  name: string
  rule: {
    min: number
    max: number
  }
}


表单中关于rule 的写法为:

< Form.Item name={['rule', 'min']}>


这种情况下,name不再是简单的字符串,应该如何用类型约束?

如果可以我希望使用类型工具,兼容多层表单数据结构,但一直没成功。

我目前的方法是,为该表单层级安排一个专用类型,该方法会有些写的麻烦,但胜在能准确的定义好类型。

我在采用该方法校验表单name数据时发现了几个很难发现的拼写错误,提前制止了测试同学提bug过来。

例如为rule属性定义单独的RuleFormItem

import type { FormItemProps } from 'antd'

const RuleFormItem = Form.Item as React.FC<
  Omit< FormItemProps, 'name'> & {
    name: ['rule', keyof FormValue['rule']]
  }
>


调用时

< RuleFormItem label="min" name={['rule', 'min']}> ...


此时数组中的 rule 与 min 都能收到类型的保护。

泛型抽象

export type TypedFormItem< T > = React.FC<
  Omit< FormItemProps, 'name' > & {
    name: T
  }
>


应用泛型

const RuleFormItem = Form.Item as TypedFormItem< keyof FormValue >


标签:用强,name,数据类型,rule,表单,FormValue,类型
From: https://www.cnblogs.com/Jcloud/p/17833461.html

相关文章

  • day07 数据类型(下)
    day06数据类型(下)常见的数据类型:int,整数类型(整形)bool,布尔类型str,字符串类型list,列表类型tuple,元组类型dict,字典类型set,集合类型float,浮点类型(浮点型)目标:掌握字典、集合、浮点类型相关知识。课程概要:set集合,一个不允许重复重复&可变类型(元素可哈希)。dict字典,一个......
  • C#数据类型、变量规范、常量和枚举
    ......
  • MySQL 导出表结构(含列名、数据类型、字段备注注释)导出成Excel
    SELECTCOLUMN_NAME列名,COLUMN_COMMENT名称,column_key主键,--COLUMN_TYPE数据类型,DATA_TYPE字段类型,CHARACTER_MAXIMUM_LENGTH长度,IS_NULLABLE是否必填,--COLUMN_DEFAULT描述FROMINFORMATION_SCHEMA.COLUMNSwhere--developer......
  • 金蝶云星空表单插件实现父窗体打开子窗体,并携带参数到子窗体
     父窗体打开子窗体准备BillShowParameterOtherInAdd=newBillShowParameter(){FormId=FormIdConst.STK_MISCELLANEOUS,//子窗体ParentPageId=base.View.PageId,//父窗......
  • 如何使用excel对数据表单进行转置
    要在Excel中对数据表单进行转置,可以按照以下步骤进行操作:1.打开Excel,并打开包含要转置的数据表单的工作簿。2.选中要转置的数据表单区域。确保选中的区域包含所有要转置的数据。3.在Excel的顶部菜单栏中找到“开始”选项卡,然后在“剪贴板”组中找到“剪切”按钮。4.单击“......
  • Python学习 —— 内置数据类型
    写在前面接上文《Python学习——初步认知》,有需要请自取:Python学习——初步认知在这篇文章中,我们一起深入了解Python中常用的内置数据类型。Python是一种功能强大的编程语言,它提供了多种内置数据类型,用于存储和操作数据。这些数据类型包括数字、字符串、序列和映射等。熟练......
  • MySQL基本数据类型简记
    1、在MySQL整型数值范围TypeStorage(Bytes)MinimumValueSignedMinimumValueUnsignedMaximumValueSignedMaximumValueUnsignedTINYINT1-1280127255SMALLINT2-3276803276765535MEDIUMINT3-83886080838860716777215INT4-2147483648021474836......
  • Redis系列之常见数据类型应用场景
    文章目录String简单介绍常见命令应用场景Hash简单介绍常见命令应用场景List简单介绍常见命令应用场景Set简单介绍常见命令应用场景SortedSet(Zset)简单介绍常见命令应用场景Bitmap简单介绍常见命令应用场景附录Redis支持多种数据类型,比如String、hash、list、Set、SortedSet、S......
  • 在vue项目开发过程中,输入框以表单形式提交后,路径中多了问号?
    结果是:http://localhost:8100/#/  改变为  http://localhost:8100/?#/  导致路由跳转出现问题。 原因:这里是form表单,点击了button按钮,触发了他的默认事件,就是触发了提交这个行为。 解决方案:使用@click.prevent阻止默认事件 <a-buttontype="primary"@click.pr......
  • Readonly只针对input(text/password)和textarea有效,而disabled对于所有的表单元素有效
    Readonly只针对input(text/password)和textarea有效,而disabled对于所有的表单元素有效,包括select,radio,checkbox,button等Readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容。但是它们之间有着微小的差别,总结如下:Readonly只针对input(tex......