Krótka odpowiedź: a[i]
jest typu any
nie string
.
Długa odpowiedź: a
jest typu string[]
. W TypeScript obiekty typu T[]
, które są indeksowane przez number
, dają wartość typu T
, ale indeksowanie ich przez string
daje w rezultacie any
. Wartości typu any
można dowolnie konwertować na dowolny inny typ.
Dlaczego?
Kiedy indeksujesz tablicę za pomocą ciągu znaków, kompilator po prostu nie ma możliwości przewidzenia, co się stanie, i utknąłeś w any
. Rozważmy:
// Elsewhere...
Array.prototype.danger = 35;
// Meanwhile, back at the ranch:
var a = [ 'z' ];
var i: string;
for (i in a) {
var x = a[i]; // i = 'danger', a[i] = 35...
}
Jeśli jesteś naprawdę pewien, że nikt nie będzie mucking z obiektem, czy bierzesz indeksy od znanego, bezpiecznego zestawu wartości łańcuchowych, można napisać typ indeksowania. W przypadku indeksowania za pomocą ciągu znaków prawdopodobnie lepiej jest użyć obiektu niż tablicy:
var a: {[s: string]: string; } = {};
a['hello'] = 'world';
var i:string;
for (i in a) {
var c : number = a[i]; // Issues an error
}
+1 - wyczerpujące wyjaśnienie. – Fenton
Nie należy w ten sposób używać konstrukcji "dla ... w". Ecma "dla ... w" to nie to samo, co foreach w języku C#. Powinieneś sprawdzić w każdej iteracji, czy jest to własność dziedziczona (jak z prototypu) czy nie. –