2012-10-18 14 views
8

Bu TypeScript kodunu yazarken, dizeden sayıya dönüştürdüğümde TypeScript derleyicisinin beni uyarmadığını gördüğüme şaşırdım.Neden TypeScript dizgeden numaraya dönüştürülmesine izin vermesin

var a = new string[]; 
a.push('a') 
a.push('b') 
a.push('c') 

var i:string; 
for (i in a) { 
    var c : number = a[i]; <---- Here a is string[] but I assign it to c which is number 
    alert(c.toString()) 
} 

cevap

18

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

+1 - kapsamlı açıklama. – Fenton

+4

"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. –