2017-02-08 13 views
1

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方法を指定することでこの問題を解決することができます:

を10

それとも、私は単純にそうように、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>を取得できるようにしたい

?または私は幸運の外ですか?

答えて

1

DRYに違反したくない場合は、一般的な問題を解決するために典型的な継承階層を使用しないでください。それだけで痛みや心配につながると非常に乱雑なリファクタリング。 JavaScript/TypeScriptでは、これは他の "OO"言語より4000%正確です。

これは、Fに縛られた多態性を介してFlowに渡すように説得する手段があるかもしれないと言っていますが、実際にはこれを気に入らないでしょう。これをどう書くかにかかわらず、Flow(または他のサウンドタイプのシステム)は、あなたがしたことに不平を言うでしょう。

+0

フィードバックいただきありがとうございます。あなたは絶対に正しいです。プロトタイプの継承はまったく違っていて、人生全体を再考する必要があります。=)普通のjavascriptは問題なく動作します。そしてあなたは正しいです、Typescriptはこれを行うときにも不平を言います。 –

+0

@RayPerea叔父さんBobは、Javaを含むどこからでも実行するべきではないことを示唆しています。なぜなら、必然的に変更する必要があるときには、変更が非常に脆いコードにつながるからです。このような小さな例で、コードDRYをどのように保つのかの具体例を示すのは難しいですが、他のより柔軟な形式のコード再利用があります。また、コードを読んでいない場合は、JavaからJS(フロー/ TS)に変換する必要がある場合でも、それを強くお勧めします。 – Norguard

関連する問題