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

这篇具有很好参考价值的文章主要介绍了用强数据类型保护你的表单数据-基于antd表单的类型约束。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

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

我在之前的工作中经常为了方便,直接将接口数据类型复用为表单内数据类型,在遇到属性类型不一致的情况时会使用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 >


🎉🎊 恭喜,现在你的表单已经被类型完整的保护了。

作者:京东零售 王凡

来源:京东有开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-746205.html

到了这里,关于用强数据类型保护你的表单数据-基于antd表单的类型约束的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 保护你的数据安全,了解网络安全法!

    网络安全法是中国自2017年6月1日起实施的一项法律,旨在保障网络安全和信息安全,维护国家安全和社会稳定。网络安全法覆盖了众多方面,包括网络基础设施安全、网络运营安全、个人信息保护、网络安全监管等,具有重要的法律意义和社会意义。在本文中,我们将从多个

    2024年02月03日
    浏览(46)
  • MySQL数据类型和约束

    MySQL支持许多的数据类型,包括数值、字符串、日期和时间等类型。数据类型的选择既需要考虑数据的实际情况,也需要考虑存储空间的大小以及计算效率等因素。 数值类型主要分为整数类型和小数类型。MySQL支持的整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT等类型;而

    2024年02月01日
    浏览(47)
  • 云计算的数据安全:如何保护你的数据免受恶意攻击

    随着云计算技术的不断发展,越来越多的企业和个人将其数据存储在云端。然而,这也意味着数据面临着更大的安全风险,恶意攻击者可能会利用各种方式来破坏数据的完整性和可用性。因此,保护数据免受恶意攻击成为了一项至关重要的任务。本文将探讨如何在云计算环境

    2024年04月10日
    浏览(50)
  • python加密字符串安全保护你的数据

    Python加密字符串可以使用标准库中的hashlib模块,该模块提供了常见的摘要算法,如MD5,SHA1等。下面是一个示例代码: Python加密字符串可以使用标准库中的hashlib模块,该模块提供了常见的摘要算法,如MD5,SHA1等。下面是一个示例代码: 运行结果:

    2024年02月07日
    浏览(57)
  • 3. MySQL - 数据类型 & 选项约束

    目录 回顾 1. 命令行下的 MySql 客户端 2. 图形化界面的 MySQL-Client 3. 数据库概述 3.1 数据库管理系统是什么 3.2 工作模式 3.3 RDBMS 管理数据的结构 3.4 客户端连接服务器的信息 4. MySQL 中的数据类型 4.1 整型类型 4.2 字符串 4.3 日期/时间 5. MySQL 每个字段的选项约束 6. 练习:将我们

    2024年02月15日
    浏览(61)
  • 前端数据安全:保护你的应用不被黑客入侵

    在当今数字化时代,前端开发者的一个主要职责是确保应用程序中的数据安全。黑客们总是在寻找机会来窃取敏感信息,所以作为前端开发者,我们需要采取一些措施来保护用户数据。本文将介绍一些前端数据安全的基本原则和技术。 HTTPS 是一种加密通信协议,可以确保数据

    2024年02月11日
    浏览(50)
  • MySQL:数据类型和表的约束

    学习语言的时候首先就是学习数据类型,数据类型起着为变量合理分配空间的作用。数据库同样需要合理使用空间,其次还可以约束SQL语句的正确性,所以同样需要数据类型。 1.0. 数据类型分类 分类 数据类型 解释 数值类型 BIT (M) 位类型。M指定位数,默认为1,范围1-64 BOOL

    2024年02月05日
    浏览(42)
  • 安全的云计算:如何保护你的数据和应用程序

    随着云计算技术的不断发展,越来越多的企业和个人将其数据和应用程序存储在云端。然而,这也意味着数据和应用程序面临着更多的安全风险。因此,了解如何保护数据和应用程序在云计算环境中的安全性至关重要。 在本文中,我们将探讨云计算的安全性,以及如何保护数

    2024年04月13日
    浏览(67)
  • 密码安全:保护你的数据不被入侵的重要性

    在数字时代,密码安全是保护个人和机构数据的关键。然而,不安全的密码可能导致严重的后果,包括个人隐私泄露、金融损失和声誉受损等。本文将探讨密码安全的重要性,揭示不安全密码的危害,列举一些因密码不安全而发生的真实事件,介绍安全的密码特征以及不安全

    2024年03月09日
    浏览(69)
  • 保护Redis:建立铁壁般的安全防线,守护你的数据财富

    Redis 的安全性是一个重要的话题,因为 Redis 是一个内存数据库,如果配置不当或者没有采取适当的安全措施,可能会导致数据泄露、未授权访问、拒绝服务攻击等安全风险。 Redis 的安全措施 1. 认证密码 通过设置密码,可以在客户端连接 Redis 时进行身份验证,以防止未经授

    2024年04月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包