【问题标题】:plainToClass does not convert a Date to stringplainToClass 不会将日期转换为字符串
【发布时间】:2020-07-30 22:15:56
【问题描述】:

根据the docsDate 对象应转换为string

请注意,当您尝试将类对象转换为普通对象时,日期将被转换为字符串。

我的带有 class-transformer 0.2.3 的示例代码无法按预期工作:

class TestDate {
  @Type(() => Date)
  aDate!: Date;
}

  const testDate = new TestDate();
  testDate.aDate = new Date();
  const result: any = classToPlain(testDate);
  console.log(typeof result.aDate);

这会将object 打印到控制台,但我希望string
我错过了什么?

【问题讨论】:

    标签: typescript class-transformer


    【解决方案1】:

    为了扩展 TmTron 的答案,我需要创建两个转换器 - 每个方向一个。然后我使用this technique 将它们组合成一个装饰器:

    // TransformDate.ts
    import { Transform } from "class-transformer";
    
    export default function TransformDate() {
      const toPlain = Transform((value) => (value as Date).toISOString(), {
        toPlainOnly: true,
      });
    
      const toClass = Transform((value) => new Date(value), {
        toClassOnly: true,
      });
    
      return function (target: any, key: string) {
        toPlain(target, key);
        toClass(target, key);
      };
    }
    

    用法:

    // User.ts
    import TransformDate from './TransformDate';
    
    export default class User {
      id: string;
      @TransformDate()
      createdDate: Date;
      // ...
    }
    

    【讨论】:

    • 请注意,在最近的版本中,Transform 函数的参数现在是一个具有value 属性的对象,而不仅仅是值,因此需要提取它。例如。解构@Transform(({ value }) => ...
    【解决方案2】:

    文档中下面这句话是错误的(见class-transformer#326):

    请注意,当您尝试将类对象转换为普通对象时,日期将被转换为字符串。

    解决方法是使用@Transform:

      @Transform(value => (value as Date).toISOString(), {
        toPlainOnly: true
      })
    

    Codesandbox example with workaround

    【讨论】:

    • 请注意,在最近的版本中,Transform 函数的参数现在是一个具有value 属性的对象,而不仅仅是值,因此需要提取它。例如。解构@Transform(({ value }) => ...
    猜你喜欢
    • 2015-04-27
    • 2011-11-28
    • 2016-05-03
    相关资源
    最近更新 更多