2017-01-02 173 views
1

我提示以下錯誤:在我vscode:打字稿屬性未找到錯誤:

[ts] Property 'getPatientAllAddress' does not exist on type 'Object'. 

爲什麼會檢查getPatientAllAddress()這是越來越動態添加方法是什麼? 這通常在Javascript不會發生。

get addresses() { 
    if (this.data && this.data.hasOwnProperty("getPatientAllAddress")) { 
     return this.data.getPatientAllAddress(); 
    } 
} 

如何禁止/忽略此警告。

+0

據我所知,你必須聲明this.data的「數據類型」,無論是通過一個接口還是內聯你聲明'data'的地方。什麼打字稿告訴你的是,你已經宣佈'data'作爲一個普通對象,但他不知道屬性「getPatientAllAddress」有效地存在,並且是一個功能是否:斷言,你必須實現一個接口,這也有利於當你輸入「this.data」時,你會用intellisense。如果你想這樣做內聯,像:'私人數據:{getPatientAllAddress:()};'應該工作。 – briosheje

回答

3

到目前爲止this.data已經有型Object。因爲你想在Object類型的變量訪問.getPatientAllAddress()屬性時發生錯誤。即使您已經邏輯確認它應該具有該屬性,編譯器還不夠聰明,無法理解它應該使該屬性在該變量的接口上可用。

解決方案1 ​​

如果沒有noImplicitAny標誌打開,您應該能夠改變最後一行

return data['getPatientAllAddress'](); 

解決方案2

脫身

設置的this.data類型:{getPatientAllAddress?:Function}(或在一個更好的世界創建對應於this.data該接口我包括該功能)。使用

任一功能或適當的更具體的類型。

溶液3

定義的界面處的全數據

interface Bleh { 
    getPatientAllAddress : Function 
} 

和型保護

function isBleh(x:any) : x is Bleh { 
    return x && x.hasOwnProperty("getPatientAllAddress"); 
} 

和作爲

if (isBleh(this.data)) { 
    this.data.getPatientAllAddress(); 
} 
使用3210

解決方案1是最簡單的,解決方案2是最正確的(儘管您也應該在該界面中定義其他所有內容,而不僅僅是這個可選功能),而解決方案3在中途顯示語言功能和半途談論你在1和2不可行的情況下需要做的事情。

+1

對於intellisense完成我會推薦解決方案2,所以,如果你將永遠需要維護這樣的代碼intellisense會幫助你一點:)。 – briosheje

+1

'getPatientAllAddress:Function' - 我認爲'(...args:any [])=>任何類型在這種情況下會更好,然後可以進一步收緊到正確的參數列表和返回類型。當使用任意函數對象時(例如期望類作爲參數時),我只會使用'Function',並且絕對不適用於可調用接口方法。 –

+1

@JohnWeisz我同意,但我不確定哪些新人更清楚。 – Paarth