использовать plainToClass в конструкторе - PullRequest
0 голосов
/ 26 марта 2019

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

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 Ответ

1 голос
/ 26 марта 2019

Полагаю, это new.target. Doc
Для получения конструктора используйте 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'
...