TypeScript for …与索引/键?

如此处所述, TypeScript引入了一个foreach循环:

var someArray = [9, 2, 5]; for (var item of someArray) { console.log(item); // 9,2,5 } 

但是没有索引/键吗? 我会期望像这样的东西:

 for (var item, key of someArray) { ... } 

.forEach已经有这个能力:

 var someArray = [9, 2, 5]; someArray.forEach((item, index) => { console.log(item); // 9, 2, 5 console.log(index); // 0, 1, 2 }); 

但是如果你想要…的能力,那么你可以map数组到项目和索引:

 for (const {item, index} of someArray.map((item, index) => ({ item, index }))) { console.log(item); // 9, 2, 5 console.log(index); // 0, 1, 2 } 

这有点长,所以它有助于把它放在一个可重用的函数中:

 function toItemIndexes<T>(a: T[]) { return a.map((item, index) => ({ item, index })); } for (const {item, index} of toItemIndexes(someArray)) { // ..etc.. } 

Iterable版本

如果使用--downlevelIteration编译器选项进行编译,则这将在定位ES3或ES5时--downlevelIteration

 function* toItemIndexes<T>(items: T[] | IterableIterator<T>) { let index = 0; for (const item of items) { yield { item, index }; index++; } } 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries

 for (var [key, item] of someArray.entries()) { ... } 

在TS中,这需要针对ES2015, 因为它要求运行时支持迭代器 ,而ES5运行时却不支持。 你当然可以使用Babel这样的东西来使输出在ES5运行时工作。

在处理集合时,可以使用for..in TypeScript运算符来访问索引。

 var test = [7,8,9]; for (var i in test) { console.log(i + ': ' + test[i]); } 

输出:

  0: 7 1: 8 2: 9 

看演示

“老派JavaScript”来拯救(对于那些不熟悉/喜欢function性编程的人来说)

 for (var i = 0; i < someArray.length ; i++) { var item = someArray[i]; }