bsc*_*tty 5 javascript jquery d3.js angularjs typescript
我有几种不同的情况,我试图在打字稿中的数组或对象上定义自制属性,但通常会收到错误:
“对象类型(或数组类型)上不存在属性 x”
例如,我在 Angular 中使用 typescript,并根据 Angular 类型定义文件定义了范围:
scope:ng.IScope
Run Code Online (Sandbox Code Playgroud)
但是当我尝试通过执行以下操作在范围上创建新属性时:
scope.anotherProperty = "string";
Run Code Online (Sandbox Code Playgroud)
我收到上面提到的错误。我知道我可以通过执行以下操作之一来解决该问题:
scope["anotherProperty"] = "string";
Run Code Online (Sandbox Code Playgroud)
或者
(<any>scope).anotherProperty = "string;
Run Code Online (Sandbox Code Playgroud)
另一个例子是当我的 d3 图中有这样的东西时:
function panZoomNode (node:any) {
for (var i = 0; i < renderedNodes.length; i++) {
if (node.id === renderedNodes[i].id) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想将该 (node:any) 参数更改为:
(node:Object)
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我收到一条错误消息“对象类型上不存在属性 id”。我知道我可以用上面提到的解决方案来纠正它,但这对我来说似乎有点草率。是否有更好的方法或最佳打字稿方法可以使数组和对象正确运行?
谢谢
ng.IScope您可以通过将以下内容添加到代码中来向界面添加额外的属性:
interface ng.IScope {
anotherProperty?:string;
}
Run Code Online (Sandbox Code Playgroud)
这将允许你打电话
scope.anotherProperty = "string";
Run Code Online (Sandbox Code Playgroud)
在没有看到代码的其余部分并且不知道node实际代表什么的情况下,我只能说,为了让编译器满意,您只需要在 TS 代码中包含您引用的成员。如果您做得正确,则创建一个包含所有成员的类。如果它派生自现有类或实现现有接口,那么您应该从类定义中的类继承。
编辑:如果您还没有,您应该在DefinitelyTyped GitHub 存储库中查找 D3 定义。假设node是 D3 类型,您可以使用它来解决您的问题并避免编写自己的类。
| 归档时间: |
|
| 查看次数: |
12278 次 |
| 最近记录: |