Es6クラスを書きたい:
_class SomeClass {
static prop = 123
method() {
}
}
_
prop
を明示的に使用せずにmethod()
から静的SomeClass
にアクセスするにはどうすればよいですか? es6では_this.constructor
_で実行できますが、TypeScriptでは_this.constructor.prop
_でエラーが発生します "TS2339:プロパティ 'prop'はタイプ 'Function'"に存在しません。
しかし、TypeScriptでは、this.constructor.propによりエラー「TS2339:プロパティ 'prop'はタイプ 'Function'に存在しません」が発生します。
TypeScriptは、constructor
の型がFunction
を超えるものであるとは推測しません(結局のところ...コンストラクターはサブクラスである可能性があります)。
したがって、アサーションを使用します。
class SomeClass {
static prop = 123;
method() {
(this.constructor as typeof SomeClass).prop;
}
}
これについて話している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
}
}
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;
}
少し汚いですが、このコードは TypeScript Playground で動作します:
class SomeClass {
static prop = 123;
constructor() {
console.log(this.constructor["prop"]);
}
}
var a = new SomeClass();
通常、簡単な方法は次のとおりです。
class SomeClass {
static prop = 123
method() {
console.log(SomeClass.prop) //> 123
}
}
これを使用する場合、SomeClass
のサブクラスはSomeClass.prop
ではなくSomeSubClass.prop
に直接アクセスすることに注意してください。サブクラスが同じ名前の独自の静的プロパティにアクセスできるようにする場合は、basaratのメソッドを使用します。
将来的にはこのクラスを拡張したいと思います。したがって、これを行うことをお勧めします。
class SomeClass<T extends typeof SomeClass = typeof SomeClass> {
static prop = 123
method() {
(this.constructor as T).prop;
}
}