TypeScript中替代as关键字实现更严格类型校验的方案
问题根源
你用的as Collections是TypeScript的类型断言,作用是主动绕过编译器的类型校验,强制告诉编译器「这个值的类型就是Collections,不需要你检查」,所以即使拼写错误也不会触发报错。
解决方案
方案1:使用TS4.9+原生satisfies运算符(最符合你的需求)
satisfies是TS4.9版本新增的运算符,作用就是原地校验值是否匹配指定类型,不会修改值本身的类型,完全符合你要的类似is的使用效果:
// 校验通过,无报错 DB.collection('Users' satisfies Collections).doc(docId).get().then(...) // 拼写错误时自动触发报错:类型 "User" 不满足预期类型 "Collections" DB.collection('User' satisfies Collections).doc(docId).get().then(...)
不需要提前声明变量,也不需要额外封装工具,原生语法直接用。
方案2:通用类型校验工具函数(兼容低版本TS)
如果你的项目TS版本低于4.9,可以写一个通用的校验工具函数,一次定义到处复用:
// 全局定义一次即可 function checkType<T>(value: T) { return value; }
使用时直接传入要校验的类型和值即可:
// 正确无报错 DB.collection(checkType<Collections>('Users')).doc(docId).get().then(...) // 错误自动提示:类型"User"的参数不能赋给类型"Collections"的参数 DB.collection(checkType<Collections>('User')).doc(docId).get().then(...)
方案3:给DB.collection方法加类型约束(最优解)
如果可以修改DB实例的类型定义,直接给collection方法的入参加上Collections类型约束,后续调用不需要加任何额外校验代码,写错自动报错:
// 定义DB类型 interface DB { collection(name: Collections): CollectionInstance } // 调用时直接传字符串即可 DB.collection('Users') // 正常 DB.collection('User') // 自动触发类型错误
内容的提问来源于stack exchange,提问作者Wajahath
相关产品推荐
相关产品推荐

