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

React+TypeScript日期转换时的类型兼容问题排查

React+TypeScript日期转换的类型兼容问题分析与修复

错误原因拆解

1. 未满足FormattedResult的字段要求

FormattedResult继承了Result接口,还额外定义了formattedScannedAt和formattedDateOfBirth两个必填字段,但你在map处理数据时完全没有返回这两个字段,TypeScript因此判定返回的对象不符合FormattedResult类型。

2. 非法修改了原Result接口的字段类型

你的代码直接覆盖了Result中多个字段的类型,违反了继承约定:

  • scannedAt原类型是Date,你通过toLocaleString将其改为字符串类型;
  • score原类型是number,toFixed(2)返回的是字符串,与原类型不匹配;
  • sampleQuality原类型是Quality枚举,经过formatQuality处理后变成了QualityValue,与原枚举类型不兼容;
  • 虽然dateOfBirth原类型是string,但你修改了它的格式,违背了FormattedResult继承Result时需保留原字段语义的原则。

修正后的代码

推荐方案:保留原数据字段,新增格式化字段

这种方式既符合类型要求,也能保留原数据用于后续业务场景:

// 假设formatQuality用于转换枚举为显示文本,新增字段存储结果而非覆盖原字段
export const formattedData: FormattedResult[] = data.map((item) => ({
  // 保留原Result的所有字段及类型
  ...item,
  // 新增FormattedResult要求的格式化字段
  formattedScannedAt: item.scannedAt.toLocaleString("en-US", {
    year: "numeric",
    month: "long",
    day: "numeric",
  }),
  formattedDateOfBirth: new Date(item.dateOfBirth).toLocaleDateString("en-US", {
    year: "numeric",
    month: "long",
    day: "numeric",
  }),
  // 新增格式化后的质量显示字段,不修改原sampleQuality
  displaySampleQuality: formatQuality(item.sampleQuality),
  // 新增格式化后的分数字段,保留原score的number类型
  formattedScore: item.score.toFixed(2)
}));

若必须修改原字段类型:调整接口定义

如果业务确实需要修改原字段类型,不要直接继承Result,而是显式定义FormattedResult的字段:

export interface FormattedResult {
  patientId: string;
  scannedAt: string; // 显式定义为字符串类型
  score: string; // 显式定义为字符串类型
  event: Event;
  sampleQuality: QualityValue; // 显式定义为QualityValue类型
  dateOfBirth: string;
  // 若不需要原格式化字段,可删除或标记为可选
}

内容的提问来源于stack exchange,提问作者Awais Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:07:25