2012-10-18 29 views

Trả lời

18

Câu trả lời ngắn: a[i] là loại any, không string.

Câu trả lời dài: a thuộc loại string[]. Trong TypeScript, các đối tượng thuộc loại T[] được lập chỉ mục bởi một kết quả number có giá trị loại T, nhưng lập chỉ mục cho chúng theo kết quả string trong một số any. Giá trị của loại any có thể được tự do chuyển đổi sang bất kỳ loại nào khác.

Tại sao?

Khi bạn lập chỉ mục mảng bằng một chuỗi, trình biên dịch đơn giản không có khả năng dự đoán điều gì sẽ xảy ra và bạn bị kẹt với any. Xem xét:

// 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... 
} 

Nếu bạn thực sự tin tưởng rằng không ai sẽ được mucking với đối tượng của bạn, hoặc bạn đang dùng các chỉ số từ một tập nổi tiếng an toàn của các giá trị chuỗi, bạn có thể viết một kiểu lập chỉ mục. Trong trường hợp bạn đang lập chỉ mục theo chuỗi, có thể bạn nên sử dụng đối tượng thay vì mảng:

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 - giải thích toàn diện. – Fenton

+4

Không sử dụng "cho ... trong" xây dựng theo cách đó. Ecma "for ... in" không giống như foreach trong C#. Bạn sẽ phải kiểm tra tại mỗi lần lặp nếu nó được thừa hưởng tài sản (như từ nguyên mẫu) hay không. –

Các vấn đề liên quan