私はTypescript 2.0でプロジェクトを手に入れました。es6
を私のモジュールとして使用しています.Lib es2017
が含まれているため、マップを使用できます。私はいくつかの不要なキャストをする必要があることを除いて、すべて機能している。es6でジェネリックを使用Typescriptで
static readonly gameStateMap: Map<GameState, Phaser.State> = new Map([
[GameState.PONG, new PongState() as Phaser.State],
[GameState.BREAKOUT, new BreakoutState() as Phaser.State]
]);
は、なぜ私はPhaser.State
にそれらをキャストする必要がありますか?彼らは両方とも直接Phaser.State
を伸ばしているので、私は問題なくマップにそれらを貼り付けることができるはずだと思った。
私は多分私はちょうど私のジェネリック宣言を洗練するために必要なと思ったので、私が試した:
Map<GameState, V extends Phaser.State>
を。
この構文はTypescript's generics docsで使用されています。
しかし、動作しません。これはES6の一般的なものですか?それは私の問題ですか?キャストする必要がないようにこれを修正するにはどうすればよいですか?
また、この問題は問題のクラスが異なるプロパティを持つ場合にのみ発生します。エラーは次のとおりです。
error TS2345: Argument of type '((GameState | PongState)[] | (GameState | BreakoutState)[])[]' is not assignable to parameter of type 'Iterable<[GameState, State]>'.
私は作るためにあなたの運動場で遊んそれはもっと私のコードに似ていて、クラスの宣言をこれに変更することで問題を再現することができました: 'class PongState imaserments Phaser.State {stuff:string; } 'class BreakoutStateはPhaser.State {notStuff:number;}を実装します。 } '。この問題は、クラスに異なるプロパティが含まれている場合にのみ発生します。 – CorayThan