在TypeScript中,我正在尝试使用for (let x in obj)
循环,但TypeScript编译器无法正确识别x
的类型...它始终假定它是string
类型
在下面的示例中,正确检测到obj
循环之外的for
类型。 TypeScript编译器将其识别为number
。但是,obj
循环中的for
在string
为number
时会被识别为let myObj: { [key: number]: number } = { 0: 43, 5: 23 };
let obj = myObj[0]; // let obj: number
for (let obj in myObj) {
if (obj == 1) {
// ^ [ts] Operator '==' cannot be applied to types 'string' and 'number'.
// TypeScript compiler thinks 'obj' is of type 'string' when used in `for in` loop.
}
}
。
%0
这会在我的代码中出现错误,我不知道如何解决这个问题。这是我做错了什么,还是TypeScript错误?
答案 0 :(得分:3)
您知道for k in o
遍历o
的属性键,而不是值,对吗?另外,JavaScript只允许 strings 作为属性键,并且会默默地将非字符串强制转换为字符串:
来自MDN's documentation for accessing properties:
属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象(包括数字)都通过toString方法转换为字符串。
这意味着TypeScript在将obj
键入string
时实际上是正确的:
for (let obj in myObj) {
console.log(typeof obj); // "string"
if (obj === "1") // okay now {
myObj[obj] = 123; // okay, property value is a number
}
}
希望有所帮助;祝你好运!