Я использую TypeScript для создания некоторых классов с KnockoutJS, с данными, загружаемыми из некоторого JSON, возвращаемого WebAPI.
Проблема в том, что я хотел скопировать значения JSON в мой класс TypeScript из конструктора: но если я делаю это только в базовом классе, унаследованные свойства не были определены и поэтому не инициализированы.
пример
Мы хотим создать элемент инвентаря из ответа JSON:
{ Name: "Test", Quantity:1, Price: 100 }
У меня есть базовый класс Product и унаследованный класс Inventory:
export class Product {
Name = ko.observable("");
constructor(source) {
// a utility that copies properties into this instance
utils.CopyProperties(source,this);
}
export class Inventory extends Product {
Quantity = ko.observable(0);
Price = ko.observable(0);
constructor(source) {
super(source); // call base c'tor
// the quantity and price properties are only now defined
}
}
Свойства для Inventory создаются только в выходном коде JS после вызова супер-конструктора, поэтому не существуют при выполнении конструктора Product.
Единственное решение, которое я вижу, - это извлечь инициализирующее значение из конструктора, но мне не очень нравится этот подход, хотя я подозреваю, что это единственный вариант.
var inventoryItem = new Inventory();
inventoryItem.LoadFrom(source);