【问题标题】:How to convert recieved string to enum如何将收到的字符串转换为枚举
【发布时间】:2022-06-10 23:29:18
【问题描述】:

我正在从一个文件中接收一些 json 对象,并且我想将一些字段解析为预定义的值。

import jobsRaw from '../../data/jobs.json';

我创建了一个类型来描述我的对象,但我希望 status 只包含我的预定义值,否则我可能会定义一个备用值。

export type Job = {
  type: string;
  id: string;
  status: JobStatus;
  warehouseId: string;
  relatedCell: string;
  relatedDocument: string;
  partnerName: string;
  potatoType: string;
  relatedBoxes: string[];
  boxCount?: number;
  createdAt: string;
  completedAt: string;
};

这是我正在尝试的映射:

const jobs: Job[] = jobsRaw.map((job: Job) => ({
  ...job,
  status: JobStatus[job.status],
  boxCount: job.relatedBoxes.length,
}));

我想创建某种 JobStatus 类型,我可以用它来解析收到的字符串值。

【问题讨论】:

    标签: arrays reactjs typescript string enums


    【解决方案1】:

    如果我必须实现这一点,我会使用type predicate 来检查数据是否是正确的JobStatus。也许是这样的:

    const isJobStatus = (value: any): value is JobStatus =>
      value && Object.values(JobStatus).includes(value);
    
    const jobs: Job[] = jobsRaw.map((job: Job) => ({
      ...job,
      status: isJobStatus(job.status) ? job.status : JobStatus.SOME_DEFAULT_STATUS,
      boxCount: job.relatedBoxes.length,
    });
    

    使用这种方法,您甚至可以在映射迭代器中使用不同的类型,如下所示,以更好地表示“原始”数据,因为类型谓词在返回 true 时会将 job.status 转换为正确的 JobStatus

    type JobRaw = Omit<Job, 'status'> & { status: string };
    
    const jobs: Job[] = jobsRaw.map((job: JobRaw) => ({
      ...job,
      status: isJobStatus(job.status) ? job.status : JobStatus.SOME_DEFAULT_STATUS,
      boxCount: job.relatedBoxes.length,
    }));
    

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2015-06-10
      相关资源
      最近更新 更多