如何枚举TypeScript类型定义的所有合法可选值?
TypeScript 的类型系统仅存在于编译阶段,运行时会被完全擦除,因此你无法直接从ArgType这个纯类型定义中获取运行时可用的取值列表。所有实现方案的核心都是维护一份运行时的基准数据源,同时通过类型推导避免类型和值的重复定义,保证二者始终同步。
方案1:自行维护基准数组,反向推导类型(最适配你的场景)
你只需要维护一份常量数组作为唯一数据源,再从数组反向推导得到等价的联合类型,不需要重复定义类型:
// 仅需维护这一份数组,后续修改取值只需要改这里 const ALL_ARG_TYPES = ['A', 'B', 'C'] as const; // 从数组推导得到的类型,和第三方包导出的ArgType完全等价 type ArgType = typeof ALL_ARG_TYPES[number]; // 遍历直接使用数组即可 ALL_ARG_TYPES.forEach((v) => { packageObject.packageMethod(v); });
如果担心自行定义的数组和第三方包的实际类型不匹配,可以增加一层编译时校验,只要第三方包的ArgType发生变更,会直接触发TS编译错误提醒你更新数组:
type PackageArgType = import('你的第三方包包名').ArgType; // 校验自定义数组的取值范围和第三方包的类型是否完全匹配 type _CheckTypeMatch = typeof ALL_ARG_TYPES[number] extends PackageArgType ? PackageArgType extends typeof ALL_ARG_TYPES[number] ? true : false : false; // 类型不匹配时这一行会报编译错误 const _typeCheckPass: _CheckTypeMatch = true;
方案2:如果第三方包导出了对应枚举
如果第三方包的ArgType是用字符串枚举定义的,你可以直接通过枚举拿到所有运行时值:
import { ArgType } from '你的第三方包包名'; const ALL_ARG_TYPES = Object.values(ArgType); ALL_ARG_TYPES.forEach((v) => { packageObject.packageMethod(v); });
从你贴的类型声明来看是纯字符串字面量联合类型,不是枚举,因此该方案大概率不适用。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

