Cor*_*han 8 generics typescript ecmascript-6
我在 Typescript 2.0 中有一个项目,我将其es6用作我的模块,其中es2017包含lib,因此我可以使用地图。除了我似乎需要做一些不必要的演员之外,我一切都在工作。
static readonly gameStateMap: Map<GameState, Phaser.State> = new Map([
[GameState.PONG, new PongState() as Phaser.State],
[GameState.BREAKOUT, new BreakoutState() as Phaser.State]
]);
Run Code Online (Sandbox Code Playgroud)
为什么我需要将它们转换为Phaser.State?由于它们都直接扩展,Phaser.State我认为我应该能够毫无问题地将它们粘贴在地图中。
我想也许我只需要完善我的泛型声明,所以我尝试:
Map<GameState, V extends Phaser.State>.
我看到Typescript 的泛型文档中使用的语法。
但它不起作用。这是一个 ES6 泛型,那是我的问题吗?我该如何解决这个问题而不需要投射?
此外,仅当相关类具有不同的属性时才会出现此问题。错误是:
error TS2345: Argument of type '((GameState | PongState)[] | (GameState | BreakoutState)[])[]' is not assignable to parameter of type 'Iterable<[GameState, State]>'.
Run Code Online (Sandbox Code Playgroud)
如果你的系统有问题。您需要提供更多信息。
它正在操场上工作
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()]
]);
Run Code Online (Sandbox Code Playgroud)
更新:您面临的问题是您手动声明类型并依赖于推断。推断只能做这么多。在这种情况下,两个内部数组无法推断为公共类型,因此它们最终为[{}, {}]. 解决办法是直接使用泛型:
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()]
]);
Run Code Online (Sandbox Code Playgroud)