gpt4 book ai didi

typescript - 在带有 Typescript 的 es6 Map 中使用泛型

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:31 25 4
gpt4 key购买 nike

我有一个 Typescript 2.0 项目,我正在使用 es6作为我的模块,使用库 es2017包括在内,所以我可以使用 map 。除了我似乎需要做一些不必要的类型转换之外,我已经让一切正常。

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 上。

我想也许我只需要完善我的泛型声明,所以我尝试了:

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]>'.

最佳答案

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

它正在 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()]
]);

关于typescript - 在带有 Typescript 的 es6 Map 中使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com