Я использую TypeScript для создания некоторых классов с помощью KnockoutJS, причем данные загружаются из некоторого JSON, возвращаемого WebAPI.Инициализация значений класса Typcript из конструктора
Проблема в том, что я хотел скопировать значения JSON в класс TypeScript из конструктора: но если я делаю это только в базовом классе, унаследованные свойства не определены и поэтому не инициализируются.
Пример
Мы хотим, чтобы создать элемент инвентаризации от ответа JSON:
{ Name: "Test", Quantity:1, Price: 100 }
У меня есть базовый класс продукт и унаследованный класс 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
}
}
свойства для Инвентарь создается только в выходном коде JS после вызова конструктора super, поэтому не существует, когда конструкция продукта или выполняется.
Единственное решение, которое я вижу, это взять инициализирующее значение из конструктора, но мне не очень нравится этот подход, хотя я подозреваю, что это единственный вариант.
var inventoryItem = new Inventory();
inventoryItem.LoadFrom(source);
Какова цель копирования свойств в базовый экземпляр? Плохо, если после копии указано количество и цена? – BSick7
Я не уверен, что понимаю, в чем проблема. Конструктор 'Product' должен установить' Name' из 'source', а конструктор' Inventory' должен установить 'Quantity' и' Price' из 'source' – MiMo
. Проблема в том, что вам нужно дважды вызвать свойства копирования: без разницы. Если вы только что сделали это в классе Product, это установит только Name. Если вы только сделали это в Inventory, вы не вызываете его в Product, поэтому ничего, что создает продукт, не будет инициализировано – Quango