web-dev-qa-db-ja.com

typescriptのthis.constructorを介した静的プロパティへのアクセス

Es6クラスを書きたい:

_class SomeClass {
    static prop = 123

    method() {
    }
}
_

propを明示的に使用せずにmethod()から静的SomeClassにアクセスするにはどうすればよいですか? es6では_this.constructor_で実行できますが、TypeScriptでは_this.constructor.prop_でエラーが発生します "TS2339:プロパティ 'prop'はタイプ 'Function'"に存在しません。

20

しかし、TypeScriptでは、this.constructor.propによりエラー「TS2339:プロパティ 'prop'はタイプ 'Function'に存在しません」が発生します。

TypeScriptは、constructorの型がFunctionを超えるものであるとは推測しません(結局のところ...コンストラクターはサブクラスである可能性があります)。

したがって、アサーションを使用します。

class SomeClass {
    static prop = 123;
    method() {
        (this.constructor as typeof SomeClass).prop;
    }
}

アサーションの詳細

18
basarat

これについて話しているMicrosoftプログラマーですが、constructorと入力する良い方法はありません。このヒントを最初に使用できます。

class SomeClass {
    /**
     * @see https://github.com/Microsoft/TypeScript/issues/3841#issuecomment-337560146
     */
    ['constructor']: typeof SomeClass

    static prop = 123

    method() {
        this.constructor.prop // number
    }
}
5
colder

this.constructorを介して静的プロパティにアクセスすることは(通常のようにSomeClass.propを実行するのではなく)、クラスの名前がわからず、thisを使用する必要がある場合にのみ役立ちます。代わりに。 typeof thisが機能しないため、回避策は次のとおりです。

class SomeClass {

  static prop = 123;

  method() {

    const that = this;

    type Type = {
      constructor: Type;
      prop: number; //only need to define the static props you're going to need
    } & typeof that;

    (this as Type).constructor.prop;
  }

}

または、クラス外で使用する場合:

class SomeClass {
  static prop = 123;
  method() {
    console.log(
      getPropFromAnyClass(this)
    );
  }
}

function getPropFromAnyClass<T>(target: T) {
  type Type = {
    constructor: Type;
    prop: number; //only need to define the static props you're going to need
  } & T;

  return (target as Type).constructor.prop;
}
0
Okku

少し汚いですが、このコードは TypeScript Playground で動作します:

class SomeClass {
    static prop = 123;

    constructor() {
        console.log(this.constructor["prop"]);
    }

}

var a = new SomeClass();
0
TSV

通常、簡単な方法は次のとおりです。

class SomeClass {
    static prop = 123

    method() {
        console.log(SomeClass.prop)  //> 123
    }
}

これを使用する場合、SomeClassのサブクラスはSomeClass.propではなくSomeSubClass.propに直接アクセスすることに注意してください。サブクラスが同じ名前の独自の静的プロパティにアクセスできるようにする場合は、basaratのメソッドを使用します。

0
pixelpax

将来的にはこのクラスを拡張したいと思います。したがって、これを行うことをお勧めします。

class SomeClass<T extends typeof SomeClass = typeof SomeClass> {
    static prop = 123

    method() {
        (this.constructor as T).prop;
    }
}
0
ktretyak