Używam TypeScript do tworzenia klas z KnockoutJS, z danymi ładowanymi z niektórych JSON zwróconych przez WebAPI.Inicjowanie wartości klasy maszynopisu z konstruktora
Problem polega na tym, że chciałem skopiować wartości JSON do mojej klasy TypeScript z konstruktora: ale jeśli zrobię to tylko w klasie bazowej, odziedziczone właściwości nie zostały zdefiniowane, a więc nie są inicjowane.
Przykład
Chcemy stworzyć element inwentaryzacji z odpowiedzi JSON:
{ Name: "Test", Quantity:1, Price: 100 }
Mam klasy bazy produktowej oraz dziedziczone klasy zapasy:
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
}
}
właściwościach Zapasy są tworzone tylko w kodzie wyjściowym JS po wywołaniu konstruktora super-, więc nie istnieją, gdy konstrukcja produktu lub jest wykonywany.
Jedyne rozwiązanie, jakie widzę, to odebranie wartości inicjalizacyjnej konstruktorowi, ale nie podoba mi się to podejście, chociaż podejrzewam, że jest to jedyna opcja.
var inventoryItem = new Inventory();
inventoryItem.LoadFrom(source);
Jaki jest cel kopiowania właściwości do instancji podstawowej? Czy to źle, jeśli ilość i cena są zdefiniowane po kopii? – BSick7
Nie jestem pewien, czy rozumiem, jaki jest problem. Konstruktor 'produktu' powinien ustawić' Name' z 'source', a konstruktor' Inventory' powinien ustawić 'Quantity' i' Price' from 'source' – MiMo
Problem polega na tym, że musisz dwukrotnie wywołać właściwości kopiowania: nie ma sensu. Jeśli właśnie zrobiłeś to w klasie Produkt, ustawiłaby tylko Nazwę. Jeśli zrobiłeś to tylko w Ekwipunku, nie wywołujesz go w Produkcie, więc wszystko, co tworzy produkt, nie zostanie zainicjowane. – Quango