2016-09-16 26 views
2

我是TypeScript的初學者。 訪問Object的數據時,我遇到了一些問題。訪問對象文字屬性時的TypeScript錯誤

let content:Array<string> = ["I", "am", "a", "beginner"] 
let data:Object = {a: "foo", b: content} 
console.log(data.a); 
console.log(data['b']); 
console.log(data.b); 

該代碼將在第5行的錯誤(在JavaScript中沒有錯誤)請 ,解釋給我聽。 感謝您的幫助。

+0

您可以接受通過 – DAXaholic

+0

答案(通過綠色複選標記)爲15分鐘,我怎麼能接受你的答案? (對不起,我是初學者) –

+0

沒有理由感到抱歉 - 請參閱http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – DAXaholic

回答

2

只是刪除的data明確聲明是Object使打字稿會推斷出類型,即它變成像這樣

let content:Array<string> = ["I", "am", "a", "beginner"] 
let data = {a: "foo", b: content} 
console.log(data.a); 
console.log(data['b']); 
console.log(data.b); 

原因在初始代碼的錯誤是因爲你告訴TypeScript編譯器,data類型爲Object或其衍生類 - 因爲類型Object沒有屬性ab這會導致錯誤。

請注意,移除顯式類型註解是不一樣的使用anyAD.Net在這種情況下,打字稿建議仍具有所有可用的類型信息 - 只是推斷(見Visual Studio代碼的截圖),而由使用any您告訴TypeScript編譯器該變量可能指向任何導致不進行類型檢查的內容。

enter image description here

+0

非常感謝您的幫助。 我明白了。 :) –

+0

您可能會提到初始分配的原因是TS忽略**額外**屬性。 – 2016-09-16 04:56:03

+0

#DAXaholic當然,如果可以的話,我會投票給你答案。 –

0

你可以指定data:any,至少你不會得到任何錯誤。如果您想要智能感知,則需要爲data創建一個type/interface,例如,

interface myData{ 
    a:string; 
    b:Array<String> 
} 
data:myData 

那麼你可以有智能感知。

+0

感謝您的幫助。 接口工作很好。 –