为什么其中一些代码不能在打字稿中迭代地图中的值?

Why some of these code cannot iterate values in a map in typescript?

我正在尝试这个 SO 问题 () in Codepen.

的答案中描述的一些打字稿成语

这是我的代码。

class KeyType {
  style: number;
  constructor(style) {
    this.style = style;  
  };
}

function test() {


  const someMap = new Map<KeyType, number>();
  someMap.set(new KeyType(style=199), 5);
  someMap.set(new KeyType(style=67), 90);

 console.log('test of 1')

  for (let [k, m] of someMap) {
    console.log(`1 k ${k} m ${m}`);
  }

   console.log('test of 2')

  for (let [k, m] of someMap.entries()) {
    console.log(`2 k ${k} m ${m}`);
  }

   console.log('test Object entries')

  for (let [k, m] of Object.entries(someMap)) {
    console.log(`3 k ${k} m ${m}`);
  }

  console.log('for each')

  someMap.forEach((v, id) => console.log(`3 v ${v} id ${id}`))

  Array.from(someMap.entries()).forEach(entry =>
    console.log(`4 k ${entry[0].style} m ${entry[1]}`)
  )

  const ar = Array.from(someMap.keys());
  console.log(ar[0].style);

}

我不明白的是:所有 forEach 方法都按预期工作,但 for (let [k,m] of someMap) {... 似乎根本不起作用。

会不会是codepen的typescript配置有问题?我在上面的代码中 test of 1test of 2test Object entries 有什么错误吗?

我想安装 ts-node 以在本地进行测试,但到目前为止我遇到了另一组关于其安装的问题。

首先,让我们修复您遇到的错误。

someMap.set(new KeyType(style=199), 5);

这是无效的 JavaScript/TypeScript 语法。如果你想 199 作为你的参数,写成:

someMap.set(new KeyType(199), 5);

第二件事是如何序列化您的 KeyType class 以便打印到控制台。

  for (let [k, m] of someMap) {
    console.log(`1 k ${k} m ${m}`);
  }

在这里,k 代表 KeyType,在您的范围内代表 class。 JavaScript 运行时通过返回 "[object] Object" 序列化 classes,我认为这不是您想要的。

如果您打算记录 KeyTypestyle,请将其替换为:

  for (let [k, m] of someMap) {
    console.log(`1 k ${k.style} m ${m}`);
  }

您可以在 TypeScript Playground 中查看最终结果。


注意:一个常见的混淆来源是变量遮蔽。你的 class 叫作 KeyType,但还有一个全局类型叫作 same.

type KeyType = "public" | "private" | "secret";

如果您的代码存在于没有任何 import/export 语句的文件中,它将被视为 script 而不是 module。这意味着全局类型将优先,如果您尝试通过 new KeyType() 调用它,您将收到编译时错误:

'KeyType' only refers to a type, but is being used as a value here.