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

如何枚举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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:03