You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:01:06