Initializing Typescript class values from constructor
Best I can come up with to allow you to have a base deserialization routine that is called from the constructor is this (modified to remove knockout dependency for testing):
class utils {
public static CopyProperties(source:any, target:any):void {
for(var prop in source){
if(target[prop] !== undefined){
target[prop] = source[prop];
}
else {
console.error("Cannot set undefined property: " + prop);
}
}
}
}
class Product {
Name = "Name";
constructor(source) {
this.init(source);
}
init(source){
utils.CopyProperties(source,this);
}
}
class Inventory extends Product {
Quantity;
Price;
constructor(source) {
super(source);
}
init(source){
this.Quantity = 0;
this.Price = 0;
super.init(source);
}
}
var item = new Inventory({ Name: "Test", Quantity: 1, Price: 100 });
It is odd that the variables are only initialized in the JS after the call to super()
. Maybe worth raising a work item on codeplex?
Playground.
This approach seems to work for me:
/// <reference path="knockout.d.ts" />
export class Product {
Name: KnockoutObservableString;
constructor(source) {
this.Name = ko.observable(source.Name);
}
}
export class Inventory extends Product {
Quantity: KnockoutObservableNumber;
Price: KnockoutObservableNumber;
constructor(source) {
super(source);
this.Quantity = ko.observable(source.Quantity);
this.Price = ko.observable(source.Price);
}
}
var item = new Inventory({ Name: "Test", Quantity: 1, Price: 100 });