プレーンなオブジェクトをクラスに変換する class-transformer

HumanData型の普通のオブジェクトを Humanクラスのインスタンスに変換します。 変換は plainToInstance() メソッドを使用します。(plainToClassはdeprecated)

npm i class-transformer reflect-metadata
import {
  Exclude,
  Expose,
  plainToInstance,
  Transform,
  Type,
} from 'class-transformer';
import 'reflect-metadata';

interface HumanData {
  id: number;
  gender: string;
  name: string;
  myoji: string;
  birthday: string;
}

enum Gender {
  MAN = 'man',
  WOMAN = 'woman',
}

class Human {
  id: number;

  gender: Gender;

  @Expose({ name: 'name' })
  firstName: string;

  @Expose({ name: 'myoji' })
  lastName: string;

  // @Type: 文字列からDate型に変換する
  @Type(() => Date)
  birthday: Date;

  // @Transform: 文字列からDate型に変換する
  // toClassOnly: プレーンオブジェクトからクラスインスタンスへの変換時にのみこの変換を適用
  // @Transform(({ value }) => new Date(value), { toClassOnly: true })
  // birthday: Date;

  // // 指定したプロパティを削除する
  // @Exclude()
  // birthday: string;
}

const humanData: HumanData = {
  id: 1,
  name: 'ichiro',
  myoji: 'sato',
  gender: 'man',
  birthday: '1991-01-01',
};

const humanInstance = plainToInstance(Human, humanData);

console.log('● humanInstance');
console.log(humanInstance);

● 文字列からDate型に変換する(その1)

  @Type(() => Date)
  birthday: Date;

● 文字列からDate型に変換する(その2)

  // toClassOnly: プレーンオブジェクトからクラスインスタンスへの変換時にのみこの変換を適用
  @Transform(({ value }) => new Date(value), { toClassOnly: true })
  birthday: Date;

● 指定したプロパティを削除する

  @Exclude()
  birthday: string;

● 変換もとオブジェクト側に持っているプロパティはそのままクラスのプロパティとなってしまう

class-transformerでオブジェクトからクラスに変換する時、クラスに定義していなくても変換もとオブジェクト側に持っているプロパティは
そのままクラスのプロパティとなってしまいます
これを防ぐには

{ excludeExtraneousValues: true } を使用します。このオプションを使用すると @Expose() しないとそのプロパティは削除されます。

import { plainToInstance } from 'class-transformer';

class User {
    @Expose()
    id: number;

    @Expose()    
    name: string;
}

const plain = {
    id: 1,
    name: 'John Doe',
    password: 'secret' // User クラスには存在しないプロパティ
};

const classObj = plainToInstance(User, plain, { excludeExtraneousValues: true });

console.log(classObj); // 'password' プロパティは含まれません

● インスタンスをプレーンなオブジェクトに変換する instanceToPlain()

以下のように配列でも変換できます。

      const sampleClassList = [
        new SampleClass({
          id: "1",
          name: `${input.name}_1`,
          updatedAt: undefined,
        }),
        new SampleClass({
          id: "2",
          name: `${input.name}_2`,
          updatedAt: undefined,
        }),
      ];
      return instanceToPlain(sampleClassList);
添付ファイル1
No.2454
01/25 21:10

edit

添付ファイル