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);
@Type(() => Date)
birthday: Date;
// 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' プロパティは含まれません
以下のように配列でも変換できます。
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);