TypeScript 如何讓 Plain Object 轉成 Class 物件
TypeScript 如何讓 Plain Object 轉成 Class 物件
Plain Object , 在Java稱為 POJO(Plain Ordinary Java Object),
有時候會稱為DTO,指的就是沒有邏輯處理的物件,只有geter 和 seter
,那我們常把此Raw Data 變成有需要邏輯處理的方法的物件,就可以用等下介紹套件來解決
有時候會稱為DTO,指的就是沒有邏輯處理的物件,只有geter 和 seter
,那我們常把此Raw Data 變成有需要邏輯處理的方法的物件,就可以用等下介紹套件來解決
使用情境
export class Test{
name = 'World';
public sayHello():void{
console.log('hello '+ this.name);
}
}
- 一般我們會將物件序列化為JSON string
const o = new Test();
const jsonS = JSON.stringify(o)
- 然後將json string 存起來
- 然後之後還原回來,作使用
const ino:Test = JSON.parse(jsonS);
ino.sayHello(); // 這時候會報錯 undefined method
- 結果會發現報錯 undefined method
export class Test{
name = 'World';
public sayHello():void{
console.log('hello '+ this.name);
}
}
const o = new Test();
const jsonS = JSON.stringify(o)
const ino:Test = JSON.parse(jsonS);
ino.sayHello(); // 這時候會報錯 undefined method
解決方法
- npm 安裝 class-transformer
npm i class-transformer
- 修改程式碼為
import { plainToClass } from 'class-transformer';
...
const ino = JSON.parse(jsonS);
const inPo = plainToClass(Test, ino);
inPo.sayHello();
這樣就解了
npm i class-transformer
import { plainToClass } from 'class-transformer';
...
const ino = JSON.parse(jsonS);
const inPo = plainToClass(Test, ino);
inPo.sayHello();
如果是巢狀結構的物件,要再做以下修改
import { Type } from 'class-transformer';
...
export class Test{
name = 'World';
@Type(() => Child)
firstChild = new Child();
@Type(() => Child)
otherChilds = new Array< Child >();
public sayHello():void{
console.log('hello '+ this.name);
}
}
export class Child{
name= 'cc';
age = 1;
public sayAge():void{
console.log(this.name+':'+age);
}
}
要加 annotation @Type 來指定轉換的型別(class)
import { Type } from 'class-transformer';
...
export class Test{
name = 'World';
@Type(() => Child)
firstChild = new Child();
@Type(() => Child)
otherChilds = new Array< Child >();
public sayHello():void{
console.log('hello '+ this.name);
}
}
export class Child{
name= 'cc';
age = 1;
public sayAge():void{
console.log(this.name+':'+age);
}
}
md code :
留言
張貼留言