2017-02-09 48 views
-1

在Angular2/Typescript網站中,代碼包含兩個提供程序ProviderA和ProviderB。無法訪問嵌套屬性內的函數

提供者A試圖調用方法:ProviderB.SomeProperty.SomeSubProperty.SomeMethod()。發生這種情況時,會拋出一個錯誤,指出「對象不支持屬性或方法'SomeMethod'」。

如果將相同的方法複製到ProviderB.SomeProperty中,也會發生這種情況。例如,對於:ProviderB.SomeProperty.SomeMethod(),TypeScript無法識別SomeMethod。

如果該函數被複制到頂級屬性,則該函數調用起作用。 ProviderB.SomeMethod()執行沒有問題。

爲什麼TypeScript只識別它直接訪問的對象上的函數?

還有一點需要注意的是:所有屬性都可以用於每個ProviderB的子屬性 - 只有函數不能被訪問。

一個後續提示:所有這些代碼在HTTP調用完成後執行。因此代碼的一部分執行HTTP.Get(),並且當應用程序收到響應時,ProviderA將嘗試調用ProviderB的嵌套方法。

+3

您應該在這裏提供一個最小的,完整的,可驗證的例子。 –

+0

函數是本地的 –

+0

@RomanC這就是我在想的除了「如果函數被複制到頂層屬性,函數調用工作」 – Jan

回答

1

我認爲你的問題的基礎是不正確的; Typescript將允許您遞歸訪問其屬性的屬性,而沒有(實際的)限制。

目前看起來像分配給SomeSubProperty的對象不實現SomeMethod()。如果缺少代碼示例,則需要調試該特定步驟並查看它發生故障的位置。

此外,this issue might possibly be related

1

好吧,我很確定我找到了問題的根源。在這個項目中,HTTP調用是針對Web服務的。該Web服務返回一些JSON。在Typescript中,JSON被轉換爲類。 IE瀏覽器,在僞代碼:

let response = HTTP.get("someurl"); 
let newObject = <SomeClass> response; 
let something = newObject.SomeMethod(); 

的JSON僅包括它被強制轉換爲類的屬性 - 的SomeMethod()不是定義。我在想這會導致對象引用錯誤。這也解釋了爲什麼ProviderB可以執行該方法。 ProviderB只是這個項目中的普通對象,而ProviderB.SomeProperty和所有的子屬性都是將一些JSON轉換爲類的結果。

如果這是正確的:這裏的基本誤解是假設在Typescript中,每個地方都有一個類的實例,可以訪問該類上的任何可用方法。情況並非如此,因爲即使一個對象可以轉換爲一個類,它也可能沒有該類定義的所有字段/方法。鴨子打字等。

+0

在接受這個之前,我會等待更徹底地進行測試,以防這實際上不是問題。 –

+1

我認爲這將是問題所在。與C#一樣,用戶有責任確保投射實際上是準確的。解決這個問題的最好方法是通過工廠函數從結果POJO中實例化那個類。 –