Причина, по которой вы получаете ошибку, не в том, что Animal
не имеет атрибута breed
(на самом деле это так, потому что экземпляр на самом деле Dog
), а в том, что вы вызываете проверку (один из них)) перед установкой всех значений, которые вы проверяете.Другое дело, что вы делаете проверку дважды, что звучит неправильно.
class Dog extends Animal {
constructor(name: string, breed: string) {
super(name); // <-- validation gets called in the parent but you did't set the breed property yet
this.breed = breed;
this.validate(); // <-- validation gets called for the second time, but this time it passes
}
}
И, поскольку super()
должен быть первым оператором в конструкторе, у вас нет способа избежать этого с вашим текущим шаблоном.
Одним из решений было бы избежать вызова validate()
в базовом классе, позволить дочерним классам правильно установить все поля и только после этого выполнить проверку.
Я не вижучто-то не так в проверке обязательных свойств в конструкторе, потому что вы препятствуете созданию объекта с недопустимым состоянием.Тем не менее, если при создании объекта не обязательно иметь все значения, я бы предложил разрешить вызывающей стороне решать, когда выполнять проверку:
const dog = new Dog('Aaron');
// do some stuff like determine the breed...
dog.breed = 'Golden Retriever';
// do some more stuff
const validationResult = dog.validate(); // did I succeed?
Еще одно замечание, которое вам не кажетсячтобы иметь необходимость иметь одинаковый точный метод validate()
, объявленный как в родительских, так и в дочерних классах.