我在TypeScript2.0中有一个项目,我使用es6作为我的模块,其中包含库es2017,这样我就可以使用地图了。除了我似乎需要做一些不必要的强制转换之外,我已经把所有的工作都做好了。
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]>'.发布于 2017-07-21 04:58:14
如果你的系统出了问题。您需要提供更多信息。
它在playground中工作
enum GameState {
PONG,
BREAKOUT
}
namespace Phaser {
export interface State { }
}
class PongState implements Phaser.State { }
class BreakoutState implements Phaser.State { }
let gameStateMap: Map<GameState, Phaser.State> = new Map([
[GameState.PONG, new PongState()],
[GameState.BREAKOUT, new BreakoutState()]
]);更新:您面临的问题是手动声明类型并依赖于推断。推论只能做这么多。在这种情况下,两个内部数组不能推断为公共类型,因此它们最终为[{}, {}]。解决方案是直接使用泛型:
enum GameState {
PONG,
BREAKOUT
}
namespace Phaser {
export interface State { }
}
class PongState implements Phaser.State { a: string }
class BreakoutState implements Phaser.State { b: string }
let gameStateMap = new Map<GameState, Phaser.State>([
[GameState.PONG, new PongState()],
[GameState.BREAKOUT, new BreakoutState()]
]);发布于 2017-07-21 08:25:33
当你这样写的时候
let gameStateMap: Map<GameState, Phaser.State> = new Map(...)编译器首先尝试推断new Map的类型,然后检查它是否与为gameStateMap声明的类型兼容。
在您的例子中,当涉及具有不同类型元素的数组时,编译器无法推断出它们的公共类型,而是使用联合类型( Map参数的预期类型显然是[GameState, Phaser.State][] )。
编译器在这方面需要一点帮助,您可以通过向Map构造函数提供显式泛型参数来提供它,然后您可以省略gameStateMap的显式类型声明
enum GameState { PONG, BREAKOUT };
namespace Phaser {
export interface State { }
}
class PongState implements Phaser.State { a: string }
class BreakoutState implements Phaser.State { b: string}
let gameStateMap = new Map< GameState, Phaser.State > ([
[GameState.PONG, new PongState()],
[GameState.BREAKOUT, new BreakoutState()]
]);https://stackoverflow.com/questions/45223857
复制相似问题