2012-10-18 22 views

Odpowiedz

18

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

+1 - wyczerpujące wyjaśnienie. – Fenton

+4

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

Powiązane problemy