TypeScript编译器未正确检测变量类型

时间:2017-12-01 02:07:17

标签: typescript

在TypeScript中,我正在尝试使用for (let x in obj)循环,但TypeScript编译器无法正确识别x的类型...它始终假定它是string类型

在下面的示例中,正确检测到obj循环之外的for类型。 TypeScript编译器将其识别为number。但是,obj循环中的forstringnumber时会被识别为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错误?

1 个答案:

答案 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
    }
}

希望有所帮助;祝你好运!