Возможно ли заставить class-transformer использовать геттеры / сеттеры при преобразовании в / из json

#typescript #class-transformer

#typescript #class-transformer

Вопрос:

Предположим, у меня есть json:

 {"firstName": "Mike", "age": 35}
  

И класс:

 export class Person {
     
    private firstName: StringProperty = new SimpleStringProperty();
    
    private age: IntegerProperty = new SimpleIntegerProperty();
    
    public constructor() {
        //does nothing
    }
    
    public setFirstName(firstName: string): void {
        this.firstName.set(firstName);
    }
    
    public getFirstName(): string {
        return this.firstName.get();
    }
    
    public setAge(age: number): void {
        this.age.set(age);
    }
    
    public getAge(): number {
        return this.age.get();
    }
    
}
  

Могу ли я заставить class-transformer использовать геттеры / сеттеры при преобразовании в / из json?

Ответ №1:

Ну, вы можете сделать это в основном с помощью Object.assign , но вам нужно использовать фактические геттеры и сеттеры, как показано ниже :

 const json  = {"firstName": "Mike", "age": 35};

 class Person {
     
    private _firstName: string |null = null;
    
    private _age: number |null = null;
    
    public constructor() {
        //does nothing
    }
    
    public set firstName(firstName: string|null) {
         // some logic
        this._firstName = firstName;
    }
    
    public get firstName(){
        // some logic
        return this._firstName;
    }
    
    public set age(age: number |null) {
         // some logic
        this._age = age;
    }
    
    public get age(){
         // some logic
        return this._age;
    }
    
}

var person = new Person();
Object.assign(person,json);

console.log(person);

console.log(person.firstName,person.age);
  

Редактировать: это может быть опасно, если свойства исходного json отличаются от целевого класса. Это может добавить некоторые дополнительные свойства к экземпляру, который не виден для системы ввода. Поэтому вы можете захотеть использовать Object.seal метод.
Ссылка на игровую площадку