Kısa cevap: a[i]
tip any
değil string
taşımaktadır.
Uzun yanıt: a
, string[]
tipindedir. TypeScript'te, number
tarafından indekslenen T[]
türünde nesneler T
türünde bir değerle sonuçlanır, ancak bir string
tarafından indekslenmesi any
sonucunu verir. any
tipindeki değerler, başka herhangi bir türe serbestçe dönüştürülebilir.
Neden?
Diziyi bir dizeyle indekslediğinizde, derleyicinin ne olacağını tahmin etme yeteneği yoktur ve any
ile takılı kalırsınız. Düşünün: Eğer hiç kimsenin nesne ile mucking olacak, yoksa dize değerleri bilinen güvenli kümesinden dizinleri alıyorsun gerçekten eminseniz, bir indeksleme türünü yazabilirsiniz
// 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...
}
. Bir dize ile indeksleme yaptığınız durumda, bir dizi yerine bir nesne kullanmanız daha iyi olur:
var a: {[s: string]: string; } = {};
a['hello'] = 'world';
var i:string;
for (i in a) {
var c : number = a[i]; // Issues an error
}
+1 - kapsamlı açıklama. – Fenton
"for ... in" inşaatını bu şekilde kullanmayın. Ecma "için ..." de foreach ile aynı değildir. Devralınan özellik (prototip gibi) ise, her yinelemede kontrol etmeniz gerekir. –