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

TypeScript中如何正确转换对象属性类型并通过类型校验?

解决基础类型报错

你最初的写法报错是因为TypeScript根据...milk自动推断preparedMilk的类型是MilkCarton,expiredAt字段的类型固定为string | undefined,自然不允许赋值Date类型的值。最简单的修复方式是直接给preparedMilk显式声明为最终要返回的MilkCartonSchema类型:

prepareMilkForDb(milk: MilkCarton): MilkCartonSchema {
  const preparedMilk: MilkCartonSchema = {
    ...milk,
  }

  if (milk.expiredAt) {
    preparedMilk.expiredAt = new Date(milk.expiredAt)
  }

  return preparedMilk;
}

多字段/嵌套字段转换的通用方案

如果需要转换的字段多、甚至存在深层嵌套的场景,可以把转换逻辑抽成通用工具,避免重复写冗余的展开逻辑:

方案1:集中在类构造函数中处理

所有转换逻辑收拢在Schema类的构造函数内,维护起来更集中:

class MilkCartonSchema {
  company: string;
  price: number;
  expiredAt?: Date;
  // ...其余20个属性

  constructor(milk: MilkCarton) {
    // 先复制所有基础属性
    Object.assign(this, milk);
    // 逐个处理需要转换类型的字段
    if (milk.expiredAt) this.expiredAt = new Date(milk.expiredAt);
    // 其他字段转换规则直接加在这里即可,嵌套字段同理处理
  }
}

// 调用时直接实例化即可
prepareMilkForDb(milk: MilkCarton): MilkCartonSchema {
  return new MilkCartonSchema(milk);
}

方案2:通用转换函数

如果不想把转换逻辑耦合在类中,可以写一个通用的转换工具,支持自定义字段转换规则:

type ConversionRule = Record<string, (value: any) => any>;

function convert<T extends object, R extends object>(input: T, rules: ConversionRule): R {
  const result = { ...input } as unknown as R;
  for (const [field, converter] of Object.entries(rules)) {
    const value = input[field as keyof T];
    if (value != null) {
      (result as any)[field] = converter(value);
    }
  }
  // 如果需要支持深层嵌套,只需要扩展规则支持点分隔的路径(比如'nested.expiredAt'),递归读取/赋值即可
  return result;
}

// 使用时只需要传入对应字段的转换规则
prepareMilkForDb(milk: MilkCarton): MilkCartonSchema {
  return convert<MilkCarton, MilkCartonSchema>(milk, {
    expiredAt: (val) => new Date(val),
    // 新增转换字段只需加一行配置
  });
}

反向转换(从DB schema转接口返回的DTO)

只需要对应写一套反向规则即可,比如把Date类型转成ISO字符串:

function convertSchemaToDto(schema: MilkCartonSchema): MilkCarton {
  return convert<MilkCartonSchema, MilkCarton>(schema, {
    expiredAt: (val) => val.toISOString()
  })
}

内容的提问来源于stack exchange,提问作者TG Person

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:54:03