TS类型的单测怎么写?最简单的方法是暂时访问该属性。如果无法访问该属性,出现异常时自然会报错,如:import{myLib}from"code";myLib.update;//正确如上所示,如果myLib不正确打开update属性会提示错误。但是这种单测不是我们要说的类型。想一想,如果我们只对用户开放.updateAPI,但是框架内部可以使用全量的.update、.add、.remove方法,如何验证框架没有向用户开放不必要的属性?一种方式是直接访问类型提示,此时会出现错误下划线:myLib.add~~~//Property'add'doesnotexistontypeMyLib说明此时代码逻辑正常,但是抛出ts错误,意味着可能会阻塞CI进程,而我们无从判断这个报错是否是“实际上是逻辑正确的表达式”,所以“某个属性不能出现”无法通过直接访问属性。我们需要做一些曲线解。使用特殊类型方法,我们可以使用extends构造一个三元类型表达式。其逻辑是,如果myLib具有.add属性,则返回a类型,否则返回b类型。因为myLib不应该提供.add属性,所以下一步判断新类型必须符合b:constcheck:typeofmyLibextends{add:any}?数字:数字[]=[];检查长度;//该行在没有.add属性的情况下不会报错,否则会报错,因为我们给的默认值是字符串,预期的正确结果也输入到number[]类型的分支中,所以check.length是正常的,如果某个变化是错误的。如果提供add,check.length会报错,因为我们定义了value[]的number类型,访问.length属性肯定会报错。另一种使用赋值语句判断的简化方式是使用true或false来判断变量类型是否匹配,如:constcheck:typeoffnextends(a:any)=>any?真:假=真;如果fn满足(a:any)=>any类型,那么检查的类型仅限于true,否则为false,所以当fn满足条件时,表达式正确,当fn不满足条件时,我们赋值将变量true设置为false类型的对象,就会出现错误。是否可以将ts转换为js?可能你有疑问,能否将ts类型验证错误转化为js对象?这样就可以将expect等断言组合到测试框架流程中。可惜,至少现在,是不可能的。只能用js变量推导类型,不能用类型生成变量。综上所述,如果要判断某些类型定义没有暴露给用户,但实际上在js变量中有这些属性,只能通过类型方案来判断正确性。例如变量myLib其实有.update和.add方法,但是提供给用户的类型定义故意隐藏了.add。这时候验证的方法就是使用跳板变量检查,使用extends判断是否包含add属性,然后使用特殊的类型方法或者直接使用赋值语句判断extends是否为真。讨论地址为:Jingdu《如何为 TS 类型写单测》·Issue#446·dt-fe/weekly想参与讨论的请戳这里,每周都有新话题,周末或周一发布。前端精读——帮你过滤靠谱的内容。关注前端精读微信公众号
