在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的嵌套方法。
答案 0 :(得分:1)
我认为你问题的根本基础是不正确的; Typescript将允许您以递归方式访问其属性的属性,没有(实际)限制。
目前看来,分配给SomeSubProperty
的对象未实现SomeMethod()
。如果没有代码示例,您需要调试该特定步骤并查看它发生故障的位置。
答案 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中,在任何地方都有一个类的实例,可以访问该类上可用的任何方法。情况并非如此,因为即使对象可以强制转换为类,它也可能没有该类定义的所有字段/方法。鸭子打字等等。