У меня два класса
export class Model {
_id: ID
constructor(arg : ID | string | Object) {
if (typeof arg === 'object') this.loadObject
}
loadObject(obj: Object) {
Object.assign(this, obj)
// using a for loop to assign keys does not work with flow
}
}
export class User extends Model {
_id: ID
username: string
//...other properties
}
Когда я вызываю new Model(userObject), все свойства определяются. Но когда я вызываю new User(userObject), определяются только некоторые свойства, некоторые остаются неопределенными. Почему это происходит и как это исправить?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы забываете вызвать в this.loadObject, и вам нужно вызвать в super в Userconstructor.
Попробуй это:
export class Model {
_id: ID
constructor(arg: ID | string | Object) {
if (typeof arg === 'object') this.loadObject(arg)
}
loadObject(obj: Object) {
Object.assign(this, obj)
}
}
export class User extends Model {
_id: ID
username: string
constructor(arg) {
super(arg)
}
}
Интересный факт: некоторые свойства инициализируются, а некоторые нет (и не зависит от типа свойства). Объект аргумента поступает из JSON, хотя это не имеет значения.
JSON значения не имеет. Если объект со всеми пользовательскими свойствами по-прежнему отображается как неопределенный.
Тогда я понятия не имею, в чем проблема. Это работает для меня .. Я создаю пользователя (new User({ prop1: 123 }) и в конструкторе пользователя после супер-вызова, который я зарегистрировал: console.info(this.prop1), и я вижу 123
Я решил использовать flow-remove-types перед компиляцией с помощью babel. Я думаю, это проблема @ babel / preset-flow. Когда он видит свойства класса, добавляет Object.defineProperty после конструктора
по-прежнему не работает для меня .. Пользовательский объект находится сразу после
this.loadObject()в конструкторе модели, но неверен, если зарегистрирован послеsuper(arg)в конструкторе пользователя.