2017-02-09 103 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中实例化那个类。 –