web-dev-qa-db-ja.com

typescript MyObject.instanceOf()

すべてのTypeScriptクラスは、以下から(直接的または間接的に)継承します。

export class WrObject {
    className:string;

    public instanceOf(name : String) : boolean {
        return this.className === name;
    }
}

次に、サブクラスを次のように宣言します。

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

}

そして、次のことを確認できます。

if (obj.instanceOf(Section.CLASS_NAME))

すべてうまくいきます。しかし、私たちができるならもっときれいになると思います:

if (obj.instanceOf(Section))

それを行う方法はありますか?または、より良いアプローチに関する提案はありますか?

ありがとう-デイブ

14
David Thielen

JavaScriptのプロトタイプの性質を受け入れたい場合は、プロトタイプチェーンをチェックするinstanceofを使用できます。

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
24
basarat

できます。 instanceOf実装を次のものに置き換えてください:

public instanceOf(cls: { CLASS_NAME: string; }) {
    return cls.CLASS_NAME === this.className || super.instanceOf(cls);
}
2
Igorbek

これはうまくいくと思います プレイグラウンドの例

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

関連する

0
BrunoLM