Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';嵌套属性中的t访问函数_Javascript_Angular_Typescript - Fatal编程技术网

Javascript Can';嵌套属性中的t访问函数

Javascript Can';嵌套属性中的t访问函数,javascript,angular,typescript,Javascript,Angular,Typescript,在Angular2/Typescript网站中,代码包含两个提供者:ProviderA和ProviderB 提供程序A正在尝试调用以下方法:ProviderB.SomeProperty.someSubperty.SomeMethod()。发生这种情况时,将抛出一个错误,说明“对象不支持属性或方法‘SomeMethod’” 如果将相同的方法复制到ProviderB.SomeProperty中,也会发生这种情况。例如,使用:ProviderB.SomeProperty.SomeMethod(),Ty

在Angular2/Typescript网站中,代码包含两个提供者:ProviderA和ProviderB

提供程序A正在尝试调用以下方法:
ProviderB.SomeProperty.someSubperty.SomeMethod()
。发生这种情况时,将抛出一个错误,说明“对象不支持属性或方法‘SomeMethod’”

如果将相同的方法复制到
ProviderB.SomeProperty
中,也会发生这种情况。例如,使用:
ProviderB.SomeProperty.SomeMethod()
,TypeScript无法识别SomeMethod

如果将函数复制到顶级属性,则函数调用有效<代码>ProviderB.SomeMethod()执行时没有问题

为什么TypeScript只识别它直接访问的对象上的函数

还有一点需要注意:所有属性都可以用于ProviderB的每个子属性-只有函数不能访问


一个后续说明:所有这些代码都是在HTTP调用完成后执行的。因此,代码的一部分执行HTTP.Get(),当应用程序收到响应时,ProviderA尝试调用ProviderB的嵌套方法。

我认为您问题的基本依据是不正确的;Typescript将允许您递归访问其属性的属性,而没有(实际)限制

目前,分配给
somesubperty
的对象似乎没有实现
SomeMethod()
。在没有代码示例的情况下,您将需要调试该特定步骤,并查看其故障在哪里


另外,.

好的,我很确定我已经找到了问题的根源。在此项目中,对web服务进行HTTP调用。该web服务返回一些JSON。在Typescript中,JSON被强制转换为类。即,在伪代码中:

let response = HTTP.get("someurl");
let newObject = <SomeClass> response;
let something = newObject.SomeMethod();
let response=HTTP.get(“someurl”);
让newObject=response;
让something=newObject.somethod();
JSON只包含它被强制转换到的类的属性,而不是
SomeMethod()
的定义。我认为这会导致对象引用错误。这也解释了为什么ProviderB可以执行该方法。ProviderB只是这个项目中的一个普通对象,而ProviderB.SomeProperty和所有子属性都是将一些JSON强制转换到类的结果


如果这是正确的:这里的基本误解是假设在Typescript中,只要有一个类的实例,就可以访问该类上可用的任何方法。事实并非如此,因为即使对象可以强制转换为类,它也可能没有该类定义的所有字段/方法。Duck键入等。

您应该在此处提供一个最小的、完整的、可验证的示例local@RomanC这也是我的想法,除了“如果函数被复制到顶级属性,那么函数调用可以工作”作为旁注,您需要检查术语。方法是作为对象属性的函数。如果它是一个局部函数,就不能按您尝试的方式调用它。如果这是一种方法,它可以
ProviderB
不是一个属性,而是一个对象(我希望,否则您会有其他问题)。你在交替使用这些术语,听起来好像你不知道它们之间的区别,这导致你认为这是你问题的根源。在任何情况下,这个问题都缺乏足够的信息,除了猜测。在接受这个问题之前,我将等待更彻底的测试,以防这实际上不是问题。我认为这将是问题所在。与C#一样,用户有责任确保铸件的准确度。解决该问题的最佳方法是通过工厂函数从结果POJO实例化该类。