предварительное выражение
Документы 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;
- Родовые коллекции
- Итераторы (лучше всего подойдут IEnumerable, интерфейсы IEnumerator)