HelloType:JS运行时数据类型检查工具

码界行者说
• 阅读 2457

HelloType:JS运行时数据类型检查工具

进入GitHub主页
使用文档

HelloType是一个api设计简单的js运行时的数据类型检查工具,它可以帮助你的js程序在使用某个(组)变量前,对变量的数据类型进行检查,防止在使用变量进行运算时由于数据类型不同导致报错。

虽然我们已经有typescript,但是它只能在编译时进行静态数据类型检查,而不能进行动态的运行时数据检查。而HelloType就是想补充这个空缺。它的使用方法非常简单,api设计非常容易理解,并且语义化。

解除API数据格式烦恼

前端通过读取后端接口返回的数据进行界面渲染,但是经常碰到的问题是,前端对后端数据无比信任,按照大家约定的格式读取数据,但是,突然有一天深夜,监控系统突然报警,南非的大老板进去页面后不断产生错误。作为有修养的程序员,果断cmd+opt+I打开开发者工具,一看,一堆红色报错,就像心脏滴血。经过一整夜的奋战,最后发现,原来是后端发布了新版本,在一个关键接口的返回数据中,统一将数值型的返回值修改成了字符串的数字。内心一阵MMP之后,你现在终于有了HelloType。

HelloType:JS运行时数据类型检查工具

图:通过hello-type提供的方法,创建具有一定格式的数据结构

当你使用HelloType创建了一个特定的数据结构容器之后,利用这个容器,和接收到的API数据进行对比,就可以知道API返回的数据格式是否符合本地规定的格式,数据节点上的数据类型是否是规定的数据类型。一旦API返回的数据格式、类型不符合要求,你就可以追踪到这个错误,并且把错误发送到你的监控系统,并且通知后端同学“你们改数据类型不通知下游团队,是要药丸吗?”

检查函数的输入输出

TypeScript是前端语言的一次升级,然鹅,它只在编译时对项目内的数据类型做检查,而无法做到运行时的类型检查。除了api的数据是不可测的以外,用户输入的数据也不可测,你还会用第三方库吧,或者你自己现在就在写一个第三方库,但凡跨项目的代码,就会有不可测的数据类型。为了学习TypeScript的接口、范型,你大刀阔斧的改项目代码,最后上线了,看看监控系统,内心MMP……

HelloType:JS运行时数据类型检查工具

图:利用ES7装饰器,快速对某个方法的输入输出的数据类型进行限制

如果你和我一样超级懒不想为了编写一大堆接口、范型、类型写一大堆和业务本身无关的ts代码时,HelloType给你直观的感受,而且完完全全是ES语法,不带半点地方方言。

静静地追踪数据类型错误

对业务代码的大举侵入是最讨厌的是,对于我的应用而言,已经做好了程序报错时的万全准备,那就是——提示用户系统出错了!!既然这样,HelloType可以帮助你收集数据类型错误,让你的代码做一段安静的代码。

HelloType:JS运行时数据类型检查工具

图:利用一个全局函数,抓取错误信息,并将错误信息通过ajax请求上传到服务器

HelloType中到trace方法完全异步,彻底的异步执行,不影响界面的渲染,在追踪到数据类型报错之后,异步执行with方法中的函数,这个函数是自定义的,因此你可以在这个函数里面做任何事情,但它是异步的,你可以收集日志,然后上传到监控系统,干得漂亮。

兼容模式和严格模式

HelloType默认是兼容模式对数据进行检查的,所谓兼容模式严格模式,主要是针对数组和对象而言。兼容模式下,一个被检查的对象如果属性比规定的要多,并不会报错,只要规定的那部分属性数据类型检查没报错即可。严格模式下,数组的元素个数必须和规定的一样,不能多也不能少,即使IfExists,也会被忽略,必须遵守严格模式。对象的话,主要是属性必须和规定的相同,不能多也不能少,IfExists也一样被忽略。

HelloType:JS运行时数据类型检查工具

图:由于多了height属性,会报错。通过strict属性获取一个类型容器的严格模式状态,对结构比较严格要求的情况非常有用

另外,还有一个方法可以开启严格模式:toBeStrict()。它直接改变当前容器为一个严格模式的容器。在必要的时候使用它会让代码显得很精炼。例如:

const SomeType = Dict({
  body: Dict({ name: String }).toBeStrict(), // 使用Dict直接作为规则的时候,由于只会在这里用到一次,所以直接调用toBeStrict()比较好
})

小结

JS的数据类型本身的混乱对于开发者而言,简直就是噩梦,但是HelloType让你可以睡个好觉。通过非常合理的代码布局,让你可以非常优秀的拦截由于数据类型问题产生的bug。而且,由于它是基于Error,所以调试起来非常方便,对于监控而言也非常有利,利用它,可以收集具体的错误数据,上报到服务端,由服务端对自己输出的数据格式和类型进行纠正。

开始使用

本文原载于 https://www.tangshuang.net/he...
如果你觉得这个想法还不错,github上给个star吧😊

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
码界行者说
码界行者说
Lv1
三生的思念酿成鸠酒哽在我咽喉.
文章
4
粉丝
0
获赞
0