#javascript #typescript #class #constructor #class-transformer
#javascript #typescript #класс #конструктор #класс-трансформер
Вопрос:
У меня есть конструктор, который присваивает свойства экземпляру:
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. Я думаю, вам следует вызывать конструктор из
plainToClass
, а не наоборот.
Ответ №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'