23

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

3 Answers 3

40

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
Sign up to request clarification or add additional context in comments.

4 Comments

I thought (can't find the post here now) that using instanceof was discouraged in typescript as being inaccurate. Did I misunderstand the other threads?
depends. You're not planning on using instanceof on a null are you ? ;) + its unreliable between iframes (its not the same Foo.prototype in each frame if you check by reference which is what this is doing underneath). Probably same issue in webworkers but I am not sure
With nulls - no. In web workers - yes everywhere. And it's with objects created in one thread, posted to another thread, and in the receiving thread we assign proto to turn the received data back into an object.
if foo.__proto__ == Foo.prototype then its okay. That is what instanceof does (or parent i.e. __proto__.__proto__ till null)
2

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);
}

1 Comment

Beware the fact that classes in different namespaces with the same name could be an issue. Programming.Parent and Genealogy.Parent are very different classes in different inheritance trees and namespaces, but would falsely test true here because their string names match.
0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.