предварительное выражение

Документы TypeScript ничего не говорят о цикле, как for или for-in. Из игры с языком кажется, что в цикле for поддерживаются только any или string переменные.

Почему это решение было принято?

Почему бы не использовать информацию о типе и иметь строго типизированную переменную итерации?

Ответ 1

Оператор for-in действительно должен перечислить свойства объекта, как это реализовано в TypeScript. Есть несколько проблем с использованием его на массивах.

Я не могу говорить от имени команды TypeScript, но я считаю, что это причина реализации на языке.

Ответ 2

В Typescript 1.5 и более поздних версиях вы можете использовать for..of, а не for..in

var numbers = [1, 2, 3];

for (var number of numbers) {
    console.log(number);
}

Ответ 3

TypeScript не дает вам пистолет, чтобы стрелять в ногу.

Итерационная переменная - это строка, потому что это строка, полная остановка. Обратите внимание:

var obj = {};
obj['0'] = 'quote zero quote';
obj[0.0] = 'zero point zero';
obj['[object Object]'] = 'literal string "[object Object]"';
obj[<any>obj] = 'this obj'
obj[<any>undefined] = 'undefined';
obj[<any>"undefined"] = 'the literal string "undefined"';

for(var key in obj) {
    console.log('Type: ' + typeof key);
    console.log(key + ' => ' + obj[key]);
}

Сколько пар ключ/значение находится в obj сейчас? 6, более или менее? Нет, 3, и все клавиши являются строками:

Type: string
0 => zero point zero
Type: string
[object Object] => this obj; 
Type: string
undefined => the literal string "undefined" 

Ответ 4

edit 2018: Это устарело, js и машинопись теперь имеют цикл for..of.
http://www.typescriptlang.org/docs/handbook/iterators-and-generators.html


Книга "Раскрытый TypeScript" говорит

"Вы можете перебирать элементы в массиве, используя циклы for или for..in, как показано здесь:

// standard for loop
for (var i = 0; i < actors.length; i++)
{
  console.log(actors[i]);
}

// for..in loop
for (var actor in actors)
{
  console.log(actor);
}

"

Оказывается, второй цикл не передает актеров в цикл. Так что сказал бы, что это неправильно. К сожалению, как и выше, циклы нетронуты машинописью.

map и forEach часто помогают мне, и из-за улучшений определений сценариев в определениях функций, более доступных в данный момент:

this.notes = arr.map(state => new Note(state));

Мой список пожеланий для TypeScript;

  1. Родовые коллекции
  2. Итераторы (лучше всего подойдут IEnumerable, интерфейсы IEnumerator)