如何循环遍历 TypeScript 枚举?

inf*_*-vv 9 typescript

我有下一个枚举:

\n
export enum Suite {\n  Spade = \'\xe2\x99\xa0\',\n  Heart = \'\xe2\x99\xa5\',\n  Club = \'\xe2\x99\xa3\',\n  Diamond = \'\xe2\x99\xa6\',\n}\n
Run Code Online (Sandbox Code Playgroud)\n

尝试实现循环,但出现错误

\n
  for (let suite in Suite) {\n    console.log(\'item:\', Suite[suite]);\n  }\n
Run Code Online (Sandbox Code Playgroud)\n
\n

元素隐式具有“any”类型,因为类型“string”的表达式不能用于索引类型“typeof Suite”。在类型 \'typeof\nSuite\' 上找不到参数为 \'string\' 类型的索引\n签名。ts(7053)

\n
\n

截屏

\n

我该如何解决这个问题?

\n

Con*_*Low 15

suite您需要使用类型约束来缩小密钥的类型。您可以通过在循环之前声明它来做到这一点:

\n
enum Suite {\n  Spade = \'\xe2\x99\xa0\',\n  Heart = \'\xe2\x99\xa5\',\n  Club = \'\xe2\x99\xa3\',\n  Diamond = \'\xe2\x99\xa6\',\n}\n\nlet suite: keyof typeof Suite;\nfor (suite in Suite) {\n    const value = Suite[suite];\n    // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或者使用Object.entries

\n
for (const [key, value] of Object.entries(Suite)) {\n    // key = Spade, etc.\n    // value = \xe2\x99\xa0, etc.\n}\n
Run Code Online (Sandbox Code Playgroud)\n

操场

\n