首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在带有Typescript的es6映射中使用泛型

在带有Typescript的es6映射中使用泛型
EN

Stack Overflow用户
提问于 2017-07-21 03:39:51
回答 2查看 12.7K关注 0票数 8

我在TypeScript2.0中有一个项目,我使用es6作为我的模块,其中包含库es2017,这样我就可以使用地图了。除了我似乎需要做一些不必要的强制转换之外,我已经把所有的工作都做好了。

代码语言:javascript
复制
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泛型吗?这就是我的问题所在?我如何才能修复它,使其不需要强制转换?

此外,只有当相关类具有不同的属性时,才会出现此问题。错误是:

代码语言:javascript
复制
error TS2345: Argument of type '((GameState | PongState)[] | (GameState | BreakoutState)[])[]' is not assignable to parameter of type 'Iterable<[GameState, State]>'.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-21 04:58:14

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

它在playground中工作

代码语言:javascript
复制
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()]
]);

更新:您面临的问题是手动声明类型并依赖于推断。推论只能做这么多。在这种情况下,两个内部数组不能推断为公共类型,因此它们最终为[{}, {}]。解决方案是直接使用泛型:

代码语言:javascript
复制
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()]
]);
票数 4
EN

Stack Overflow用户

发布于 2017-07-21 08:25:33

当你这样写的时候

代码语言:javascript
复制
let gameStateMap: Map<GameState, Phaser.State> = new Map(...)

编译器首先尝试推断new Map的类型,然后检查它是否与为gameStateMap声明的类型兼容。

在您的例子中,当涉及具有不同类型元素的数组时,编译器无法推断出它们的公共类型,而是使用联合类型( Map参数的预期类型显然是[GameState, Phaser.State][] )。

编译器在这方面需要一点帮助,您可以通过向Map构造函数提供显式泛型参数来提供它,然后您可以省略gameStateMap的显式类型声明

代码语言:javascript
复制
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()]
]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45223857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档