2016-09-30 43 views
2

存在我这里,我试图确定在打字稿数组或对象的自制属性,但通常得到的错误几种不同的情况:最好的方式来解决打字稿错误 - 属性不会对类型

“属性X不能在类型对象(或数组类型)”存在

比如我基于锥型定义文件使用角打字稿和一个确定的范围:

scope:ng.IScope 

但后来当我尝试在范围内创建一个新的财产:

scope.anotherProperty = "string"; 

我得到上面提到的错误。我知道我可以做的一个解决了下列文件:

scope["anotherProperty"] = "string"; 

OR

(<any>scope).anotherProperty = "string; 

另一个例子是,当我有我的D3图形内是这样的:

function panZoomNode (node:any) { 
      for (var i = 0; i < renderedNodes.length; i++) { 
       if (node.id === renderedNodes[i].id) { 

        } 
       } 
     } 

理想,我想将(node:any)参数更改为类似于:

(node:Object) 

但是当我这样做时,我收到一个错误,说“属性ID不存在于类型对象”。我知道我可以用上面提到的解决方案来纠正它,但对我来说这似乎有点草率。有没有更好的方式或最好的打字方式让这些数组和对象正确运行?

感谢

+2

你可以继承ng.IScope,添加另一个属性的定义和使用?后一个问题是由于Object没有id属性造成的。您可以将它与任何类型放在一起或创建一个类/接口。 –

+0

是的,我应该能够继承,那么添加定义的最佳方式是什么?那样会允许我做一些像“scope.anotherProperty = string”的东西。另外,如果我要添加一个接口,那么我想只设置节点对象可能具有的所有属性,或者如果我只是使用ID,我最好只是添加ID?然后在参数定义中调用它。谢谢 – bschmitty

+1

我在下面添加了一个答案。你可以扩展它,而不是从ng.IScope继承。 –

回答

1

您可以通过添加额外的属性添加到ng.IScope接口下面给您的代码:

interface ng.IScope { 
    anotherProperty?:string; 
} 

这将允许你打电话

scope.anotherProperty = "string"; 

在没有看到你的代码的其余部分,并知道什么node实际上代表我只能说,为了让编译器感到高兴你只需要包括您在TS代码中提到的成员。如果你做得很好,那么创建一个包含所有成员的类。如果它来自现有的类或实现现有的接口,那么你应该继承你的类定义中的那些接口。

编辑:如果你还没有,你应该在D3定义的DefinitelyTyped GitHub回购看。假设node是D3类型,您可以使用它来解决您的问题并避免编写自己的类。

+0

是的,我最终只是扩展ng.IScope并添加了我需要访问的其他属性。这工作正常。我的编辑不喜欢按照您在答案中所述的方式使用界面。对于节点,我确实看过D3类型的defs,但在我的情况下没有任何节点在那里工作,因为我使用的是dagre-d3以及特定的属性。我只是创建了一个接口并添加了我需要的属性,这对我来说很有用。谢谢 – bschmitty

相关问题