我被告知不要for...in在JavaScript中使用数组.为什么不?
我已经定义了一个静态属性:
private static colorsByName: { [index: string]: MyColorClass}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用for... of此处列出的答案时:TypeScript for-in语句
for(let value of MyClass.colorsByName) {
...
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
输入{[index:string]:MyColorClass; }不是数组类型或字符串类型.
如果我切换到使用for in,则错误消失,但value输入为any.
for(let value of MyClass.colorsByName) {
...
}
Run Code Online (Sandbox Code Playgroud)
value在这种情况下,实际的类型是什么?理想情况下,我想循环遍历colorsByName属性中的所有值,无论是在成对方法中,还是只是为了MyColorClass返回返回的类型.
for(let value of MyClass.colorsByName) {
// value: MyColorClass
}
Run Code Online (Sandbox Code Playgroud)
我有什么选择?
我想迭代对象数组并在打字稿中访问该迭代对象的属性值。
在 C# 中执行此操作,只需通过数组执行 foreach 即可。
在打字稿中,这似乎有点不同。我们可以执行 foreach,但我们无法访问“完整”对象,该怎么办?
@Input() gridDefinitions: GridColumnDefinition[]
public test() {
for (var def **in** this.gridDefinitions){
var test = <GridColumnDefinition>this.selectedObject;
let castedtype = <GridColumnDefinition>def; // this gives an error
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我刚刚遇到了解决方案。问题在于如何迭代集合。当使用of代替in时,我们可以访问迭代对象。请参阅TypeScript for-in 语句
这看起来像打字稿编译器的问题,但不确定,也许我不理解打字稿类型推断.任何人都可以解释这个问题:
我有这个简单的代码在"TypeAs"列表上执行某些操作.当列表的类型为"TypeA []"时,变量"item"的类型为"Any".因此,为了具有类型安全性和智能感知,我必须转换类型.
var list: TypeA[] = this.getListOfTypeAs();
for (var item in list) {
var typedItem = (<TypeA> item); //clearly a problem with typescript
Run Code Online (Sandbox Code Playgroud)
为什么?