TypeScript中如何将接收的字符串转换为自定义枚举值
实现方案
1. 定义JobStatus字符串枚举
首先定义包含所有合法业务状态、带兜底默认值的字符串枚举,枚举值需要和JSON文件中存储的合法状态字符串完全匹配(大小写、字符完全一致):
export enum JobStatus { // 以下为仓储作业场景示例值,替换为你业务实际的合法状态即可 Pending = 'PENDING', InProgress = 'IN_PROGRESS', Completed = 'COMPLETED', Cancelled = 'CANCELLED', // 非法值兜底默认值,可根据业务需求调整为其他默认状态 Default = 'UNKNOWN' }
2. 编写安全的状态转换逻辑
你原来的JobStatus[job.status]写法仅适用于数字枚举的反向映射,字符串枚举不支持该写法,且没有做非法值校验,需要替换为带校验的转换逻辑:
/** * 把原始JSON中的状态字符串转换为合法JobStatus枚举值 * 非预定义值统一返回兜底默认值 */ const parseJobStatus = (rawStatus: string): JobStatus => { const validStatusList = Object.values(JobStatus); return validStatusList.includes(rawStatus as JobStatus) ? (rawStatus as JobStatus) : JobStatus.Default; };
3. 修正数据导入映射逻辑
原始JSON读取出来的status字段是任意字符串,不符合Job类型约束,不要直接把原始数据标注为Job类型,先定义原始数据类型再做映射:
// 定义JSON原始数据类型,status为未校验的字符串 type RawJob = Omit<Job, 'status' | 'boxCount'> & { status: string; }; const jobs: Job[] = (jobsRaw as RawJob[]).map((job) => ({ ...job, status: parseJobStatus(job.status), boxCount: job.relatedBoxes.length, }));
注意事项
- 枚举中的字符串值必须和
jobs.json中存储的合法状态值完全一致,包括大小写、特殊字符,否则会被判定为非法值走兜底逻辑 - 如果JSON中存储的是中文状态值,直接把枚举赋值改为对应中文即可,比如
Pending = '待处理',转换逻辑无需调整 - 兜底默认值可根据业务需求修改,比如需要把非法状态默认设为待处理,直接把
Default对应的值改为PENDING即可
内容的提问来源于stack exchange,提问作者Aaron Bison
相关产品推荐
相关产品推荐

