2016-06-18 237 views
2

JavaScript對象添加數據,因此,普通的JavaScript可以執行的代碼塊罰款:在打字稿

var myObj = {}; 
myObj['one'] = {}; 

console.log(myObj); 
console.log(myObj.one); 

但你在打字稿Property 'one' does not exist on type '{}'

得到這個錯誤,這只是設計? (例如,我希望把我自己的類此)

+0

你的代碼與JSON沒有任何關係。 TypeScript執行靜態類型分析。所以是的,它給你的錯誤是設計的。 –

+0

對不起,我不知道如何解釋它。這就是我從API響應中獲取的數據類型(res.json())。 –

+2

很多人在說'JSON'時會引用普通的'JavaScript'對象。 'JSON'引用該JavaScript對象的實際可讀文本表示。 – Cristy

回答

3

damitij07's answer涵蓋了一堆的方法來解決這個問題,但我想指出我最喜歡的這種用例:interfaces

interface myObj { 
    one:any; 
} 

現在您可以將變量標記爲界面,並且Typescript將檢查以確保對象符合要求。像任何其他類或類似的東西一樣傳遞它,它將在編譯時消失。沒有額外的工作js引擎,只需編譯時間檢查。

const myObjInstance:myObj = {one:0}; 
function foo(x:myObj):myObj { return x; } 

如果你需要的領域是可選的,如果你不分配給字段

interface myObj { 
    one?:any; 
} 

現在打字稿不會抱怨。

最後要說明的是,這一切都假定您相信對象是您期望的。如果你從外部獲得了這個東西,即使你擁有它,你也應該在運行時檢查這個結構是否可以避免錯誤。

1

當你寫的代碼像這樣通過預測對象的類型,當你把它聲明打字稿介紹類型綁定錯誤。

var myObj = {}; 
myObj['one'] = {}; 

有很多建議解決或解決此模糊性,而編碼的方法:

創建一個類的對象,並創建一個實例。

export class myObj { 
    one:any; 
} 

let myObjInstance:myObj = new myObj(); 
myObjInstance.one = {}; 
// 
console.log(myObj); 
console.log(myObj.one); 

另一種簡單的方法來解決可

//set type of myObj is any 
let myObj:any = {}; 
myObj['one'] = {}; 
//no error 
console.log(myObj); 
console.log(myObj.one); 

或可能,如果你想動態類型轉換

let myObj = {}; 
//cast while assigning 
(<any>myObj)['one'] = {}; 

//no error 
console.log(myObj); 
console.log(myObj.one);