如何实现TypeScript运行时类型与值验证的通用方案?
TypeScript类型守卫函数实现运行时类型校验方案
调用API获取数据时,常需要在运行时验证数据的类型与合法性,同时让TypeScript编译器识别校验后的类型。类型守卫函数function isThing(value: unknown): value is Thing是这类场景的通用解决方案——它既完成运行时校验,又能向编译时传递类型信息。
具体实现步骤
1. 定义目标类型
先明确要校验的类型结构,比如定义Thing接口:
interface Thing { thingProperty: string; doThingThing: (param: string) => void; }
2. 实现类型守卫函数
编写isThing函数,内部完成运行时校验逻辑,同时通过value is Thing的返回类型注解,让TypeScript编译器识别校验通过后的类型:
function isThing(value: unknown): value is Thing { // 先排除null/undefined if (value == null) return false; // 检查是否为对象类型 if (typeof value !== 'object') return false; // 断言为对象后,校验必要属性的类型 const thing = value as Thing; return ( typeof thing.thingProperty === 'string' && typeof thing.doThingThing === 'function' ); }
3. 使用类型守卫进行校验
按需求逻辑使用该函数,编译器会自动缩小变量的类型范围:
function getSomething(): unknown | undefined { // 模拟API返回数据 return { thingProperty: 'test', doThingThing: (param: string) => console.log(`Doing thing: ${param}`) }; } const v: unknown | undefined = getSomething(); // 运行时校验 if (isThing(v)) { // 编译时v被推断为Thing类型,可直接调用属性和方法 v.doThingThing(v.thingProperty); } else { // 校验不通过时,v仍为unknown | undefined if (v != null) { // 此处v被推断为unknown类型,可做进一步校验 console.log('值不是Thing类型,但不为null/undefined'); } else { // 此处v被推断为undefined console.log('值为undefined'); } }
通用扩展思路
- 组合守卫:校验复杂嵌套类型时,可编写多个小守卫函数组合使用,比如
isAddress配合isUser - 泛型守卫:针对结构类似的类型,用泛型封装通用校验逻辑,减少重复代码
- 枚举类型校验:对于枚举值,可通过枚举的
values()方法校验值是否属于枚举范围
内容的提问来源于stack exchange,提问作者SharePointBeginner
相关产品推荐
相关产品推荐

