无法访问嵌套属性中的函数

时间:2017-02-09 18:09:01

标签: javascript angular typescript

在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的嵌套方法。

2 个答案:

答案 0 :(得分:1)

我认为你问题的根本基础是不正确的; Typescript将允许您以递归方式访问其属性的属性,没有(实际)限制。

目前看来,分配给SomeSubProperty的对象未实现SomeMethod()。如果没有代码示例,您需要调试该特定步骤并查看它发生故障的位置。

此外,this issue might possibly be related

答案 1 :(得分:1)

好的,我很确定我找到了问题的根源。在此项目中,将对Web服务进行HTTP调用。该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中,在任何地方都有一个类的实例,可以访问该类上可用的任何方法。情况并非如此,因为即使对象可以强制转换为类,它也可能没有该类定义的所有字段/方法。鸭子打字等等。