plainToClass не преобразует дату в строку

Согласно Документах аDate объект должен быть преобразован в string:

Обратите внимание, что даты будут преобразованы в строки, когда вы попытаетесь преобразовать объект класса в простой объект.

Мой пример-код с классом-преобразователем 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.
Что мне не хватает?

2 ответа

Решение

Следующее предложение в документации неверно (см. Преобразователь классов #326):

Обратите внимание, что даты будут преобразованы в строки, когда вы попытаетесь преобразовать объект класса в простой объект.

Решение - использовать @Transform:

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

Codesandbox пример с обходным путем

Чтобы расширить ответ TmTron, мне нужно было создать два трансформатора - по одному в каждом направлении. Затем я объединил их в один декоратор, используя эту технику:

// 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;
  // ...
}
Другие вопросы по тегам