javascript - Typescript "Element implicitly has an ' any' 类型,因为类型 'Rank' 的表达式不能用于索引类型 'IPowerCards' "

标签 javascript typescript

我正在构建一款纸牌游戏,有以下类型:

type Rank = "A"| "2"| "3"| "4"| "5"| "6"| "7"| "8"| "9"| "T"| "J"| "Q"| "K";

interface IPowerCards {
  [key: Rank]: any
}

我还有以下对象,我尝试使用排名字符串访问:

const powerCards: IPowerCards = {
  "A": {
    canPlayOnAnyCard: true,
    canChangeSuit: true,
  },
  "2": {
    canCounterPenaltyCard: true,
    penaltyAmount: 2,
  },
  ...,
};

此对象上的所有键都是有效的 Rank 类型。我尝试使用以下代码访问 powerCards 对象上的值:

const rank = getRank(card) as Rank;
return rank && powerCards[rank]?.canCounterPenaltyCard

但是,我收到错误 Element 隐式具有“any”类型,因为“Rank”类型的表达式不能用于索引“IPowerCards”类型。类型“IPowerCards”上不存在属性“A”。 此错误消息对我来说没有意义,因为我确保 rank 变量(我用来访问 powerCards 对象的变量)的 >Rank 类型,这是我在 IPowerCards 类型定义中指定的类型。我哪里错了?谢谢

最佳答案

使用 Record 代替 IPowerCards:

type IPowerCards = Record<Rank, any>

如果您想让属性可选:

type IPowerCards = {
  [key in Rank]?: any
}

关于javascript - Typescript "Element implicitly has an ' any' 类型,因为类型 'Rank' 的表达式不能用于索引类型 'IPowerCards' ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71888834/

相关文章:

javascript - jQuery 倒计时文本消息到期

reactjs - 在 React 中使用 Firebase 9、Redux Toolkit 和 Typescript 令人头疼。 'dispatch' 不知何故具有类型 'never' ?

node.js - NestJS e2e 测试模拟 Session 装饰器

typescript - 错误 TS1046 : 'declare' modifier required for top level element

typescript - 接口(interface)不能扩展条件类型中的映射类型

javascript - jquery 在 Internet Explorer 中不可用

javascript - 使用输入搜索 json

javascript - JS - 将数组或字符串转换为参数列表 [SQLite insert with bind parameters]

TypeScript 0.9 重载可调用

javascript - 在 react 应用程序中位置更改之前解码网址