在 es6 Map 和 Typescript 中使用泛型

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)

uni*_*nal 4

如果你的系统有问题。您需要提供更多信息。

它正在操场上工作

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)