2013-02-28 51 views
2

考慮以下代碼:重複申報打字稿

var a = []; 

for (var i in a) 
    /* nothing */; 

var i : number; 

i = 9; 

如果我編譯,編譯器抱怨的最後一行,他說:「無法將‘數量’到‘線’」。

想必for..in循環創建i作爲一個字符串,但我本來期望編譯器抱怨var i : number而不是等到i = 9這抱怨之前。

如果我將var i : number更改爲var i : number = 8,編譯器仍然不會抱怨,直到達到i = 9

這是一個錯誤,還是我錯過了什麼?

回答

3

如果您最初聲明瞭變量,它會在您預測的位置發出警告。例如,如果你放在這條線在你的代碼的頂部:

var i: string; 

它會提醒你上線重複的標識符:

var i: number; 

它不會檢測當重複的識別碼你在for語句中聲明瞭i,或許它應該 - 這樣你最終會得到一個不同的錯誤,那就是當你指定一個錯誤類型的值時。

如果你想重複的標識警告,這是這裏的第一個也是最重要的錯誤,最好的辦法是登錄錯誤上http://typescript.codeplex.com/

+0

謝謝你,史蒂夫。我按照你的建議:http://typescript.codeplex.com/workitem/771 – oz1cz 2013-02-28 14:54:50

0

這是不是一個錯誤,以瞭解發生了什麼事情,你必須瞭解JavaScript的行爲,特別是有關吊裝的區域。從本質上講,你有上面的代碼是一樣的:

var a = [], 
    i; 

for (i in a) 
    /* nothing */; 

i = 9; 

由於i在你的聲明,其類型正在成爲一個字符串第一次遇到。 for (key: string in someVar) { }

下面是描述在JavaScript提升和範圍的一篇文章: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+0

但是這並不能解釋爲什麼編譯器不會抱怨'var i:number = 8'。 – oz1cz 2013-02-28 14:44:15

+0

編譯器在我執行'var i:number = 8;'時抱怨我,至少在0.8.2版本中。 – 2013-02-28 15:19:19

+0

我使用0.8.3,並沒有抱怨。 – oz1cz 2013-02-28 15:55:06