解决打字稿错误的最佳方法 - 类型

时间:2016-09-30 21:25:56

标签: javascript jquery angularjs d3.js typescript

我有几种不同的情况,我试图在typescript中的数组或对象上定义自制属性,但通常会得到错误:

“属性x在类型Object(或类型数组)”

上不存在

例如我在Angular中使用typescript并且具有基于Angular类型定义文件的已定义范围:

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”。我知道我可以用上面提到的解决方案纠正它,但这对我来说似乎有点草率。有没有更好的方法或最好的打字方式让这些对阵列和对象正确运行?

由于

1 个答案:

答案 0 :(得分:1)

您可以通过在代码中添加以下内容,将额外属性添加到ag('GrossLoss', 'Age', mean, DatasetOne) 界面:

ng.IScope

这将允许您致电

interface ng.IScope {
    anotherProperty?:string;
}

如果没有看到代码的其余部分并且知道scope.anotherProperty = "string"; 实际代表什么,我只能说为了让编译器满意,您需要在TS代码中包含您引用的成员。如果您正确地执行它,则创建一个包含所有成员的类。如果它派生自现有类或实现现有接口,那么您应该从类定义中的那些继承。

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