All of our typescript classes inherit (directly or indirectly) from:
export class WrObject { className:string; public instanceOf(name : String) : boolean { return this.className === name; } }
We then declare a subclass as:
export class Section extends WrObject { public static CLASS_NAME = 'Section'; className = Section.CLASS_NAME; public instanceOf(name : String) : boolean { if (this.className === name) return true; return super.instanceOf(name); } }
And you can then check with:
if (obj.instanceOf(Section.CLASS_NAME))
It all works great. However, I think it would be cleaner if we could do:
if (obj.instanceOf(Section))
Is there any way to do that? Or any suggestions as to a better approach?
thanks - dave
If you are willing to accept the prototypal nature of JavaScript you can just use instanceof
which checks the prototype chain:
class Foo{} class Bar extends Foo{} class Bas{} var bar = new Bar(); console.log(bar instanceof Bar); // true console.log(bar instanceof Foo); // true console.log(bar instanceof Object); // true console.log(bar instanceof Bas); // false
You can do it. Just replace your instanceOf
implementation with this one:
public instanceOf(cls: { CLASS_NAME: string; }) { return cls.CLASS_NAME === this.className || super.instanceOf(cls); }
I guess this might work Example on Playground
var getName = function(obj) : string { var funcNameRegex = /function (.{1,})\(/; var results = (funcNameRegex).exec(obj); return (results && results.length > 1) ? results[1] : ""; }; class Foo { } function IsTypeOf(obj: any, type: Function) { alert(obj.constructor.name + " == " + getName(type)); } IsTypeOf(new Foo(), Foo);
Related