использовать открытый класс в конструкторе

#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'