为什么其中一些代码不能在打字稿中迭代地图中的值?
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 1
、test of 2
和 test 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,我认为这不是您想要的。
如果您打算记录 KeyType
的 style
,请将其替换为:
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.
我正在尝试这个 SO 问题 (
这是我的代码。
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 1
、test of 2
和 test 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,我认为这不是您想要的。
如果您打算记录 KeyType
的 style
,请将其替换为:
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.