Использовать plainToClass в конструкторе

У меня есть конструктор, который присваивает свойства экземпляру:

class BaseModel {
    constructor (args = {}) {
        for (let key in args) {
            this[key] = args[key]
        }
    }
}

class User extends BaseModel {
    name: string
}

Тогда я могу создать экземпляр как это:

let user = new User({name: 'Jon'})

Теперь я хотел бы заменить эту базовую функциональность на класс-трансформер:

let user = plainToClass(User, {name: 'Jon'})

Моя кодовая база использует первый подход во многих местах, и поэтому я хотел бы реализовать новый путь в конструкторе, чтобы не ломать старый код:

 constructor (args = {}) {
        let instance = plainToClass(CLASSTYPE, args)
        for (let key in Object.keys(instance)) {
            this[key] = instance [key]
        }
    }

Как я могу получить тип класса в конструкторе? Я не могу использовать User, потому что это базовая модель, и другие классы также могут выходить из нее.

1 ответ

Я полагаю, это new.target, доктор
Чтобы получить использование конструктора new.target.prototype.constructorи это собственность name - чтобы получить имя класса.

class BaseModel {
    typeName: string;

    constructor (args = {}) {
        this.typeName = new.taget.constructor.name;
    }
}

class User extends BaseModel {
}

const user = new User();
const typeName = user.typeName; // this would return 'User'
Другие вопросы по тегам