JavascriptとFlowTypeに問題があります。私は何をしようとしていることは、私は簡単に以下の例を見てみましょうthis.cls.staticProperty
のようなコードを使用して、インスタンスメソッド内のクラスのメソッドを参照することができるように静的クラスを返します:"this"のコンストラクタにJavascriptで注釈を付ける方法
// @flow
class A {
// This is where it fails... It cannot return Class<this>
// ERROR: Flow: `this` type. invariant position (expected `this` to occur only covariantly)
get cls(): Class<this> {
return this.constructor
}
}
、私は単純にこの問題を解決できることを知っています明示的A
を指定することで、その後私は、子供のクラスで問題を取得
// @flow
class A {
// This works
get cls(): Class<A> {
return this.constructor
}
}
class B extends A {
static myProp: string
doSomething(): void {
// But, now, this doesn't work
// ERROR: Flow: property `myProp`. Property not found in statics of A
this.cls.myProp = "Hello World"
}
}
私は今とてもB
にも同様にcls
方法を指定することでこの問題を解決することができます:
それとも、私は単純にそうように、Class<any>
を返すことができます:今、私のIDEは、私が入力する必要がこだわっているので、クラスで私にあらゆる種類のヒントやオートコンプリートの特性を与えるものではありません、
// @flow
class A {
// Now, we are returning the constructor of any
get cls(): Class<any> {
return this.constructor
}
}
class B extends A {
static myProp: string
doSomething(): void {
// Works now, but now my IDE doesn't give me auto complete
// And I'm having to manually look up static properties and methods
this.cls.myProp = "Hello World"
}
}
をしかし、プロパティとエラーが発生しやすくなり、メモリからの方法うちは、それが継続的に静的なメソッドとプロパティ
私が試した別の解決策はただcls
ゲッターを取り払うとだけではなく、実際のクラスを指定しての検索にかかる時間を言及しないように私は静的なプロパティが必要なときに名前が、そこにも問題があります....このコードを考えてみましょう:
// @flow
class A {
static myProp: string
get staticMyProp(): string {
return A.myProp
}
}
A.myProp = "A Hello World"
class B extends A {
}
B.myProp = "B Hello World"
let bObj = new B()
console.log(bObj.staticMyProp) // Logs "A Hello World"
// But we expected "B Hello World" since we are running it from the B instance
そして、もう一つ最後のオプション....私はちょうどthis.constructor
を毎回指定することができます....しかし、私は本当にそれを行うにはしたくない...それは私が「何ですので、私はむしろthis.cls
を使用したいですmは(Pythonの背景から来る)に使用
// @flow
class A {
static myProp: string
get staticMyProp(): string {
return this.constructor.myProp
}
}
A.myProp = "A Hello World"
class B extends A {
}
B.myProp = "B Hello World"
let bObj = new B()
console.log(bObj.staticMyProp) // Logs "B Hello World" as expected
私は本当にフロータイプ、任意の提案で、動作するように(上記の最初の例)オプションを
get cls(): Class<this>
を取得できるようにしたい
?または私は幸運の外ですか?
フィードバックいただきありがとうございます。あなたは絶対に正しいです。プロトタイプの継承はまったく違っていて、人生全体を再考する必要があります。=)普通のjavascriptは問題なく動作します。そしてあなたは正しいです、Typescriptはこれを行うときにも不平を言います。 –
@RayPerea叔父さんBobは、Javaを含むどこからでも実行するべきではないことを示唆しています。なぜなら、必然的に変更する必要があるときには、変更が非常に脆いコードにつながるからです。このような小さな例で、コードDRYをどのように保つのかの具体例を示すのは難しいですが、他のより柔軟な形式のコード再利用があります。また、コードを読んでいない場合は、JavaからJS(フロー/ TS)に変換する必要がある場合でも、それを強くお勧めします。 – Norguard