如何在Typescript中使用Cytoscape.js的UI扩展?

如何在Typescript中使用Cytoscape.js的UI扩展?,typescript,cytoscape.js,Typescript,Cytoscape.js,是否可以在Typescript中使用Cytoscape UI扩展? 布局扩展可以使用,但当我需要时,例如,我不能调用函数cy.cxtmen(默认值),因为它不在cytoscape界面中。有没有办法使用它 index.ts中的我的代码: import cytoscape = require('cytoscape'); import contextMenus = require('cytoscape-cxtmenu'); cytoscape.use(contextMenus); const cy

是否可以在Typescript中使用Cytoscape UI扩展? 布局扩展可以使用,但当我需要时,例如,我不能调用函数cy.cxtmen(默认值),因为它不在cytoscape界面中。有没有办法使用它

index.ts中的我的代码:

import cytoscape = require('cytoscape');
import contextMenus = require('cytoscape-cxtmenu');
cytoscape.use(contextMenus);

const cy = cytoscape({
    container: document.getElementById('cy'),
    ...
});
let defaults = {
     menuRadius: 100, 
     selector: 'node',
    //...
};

let menu = cy.cxtmenu( defaults );
为了索引d.ts,我添加了以下声明:

declare module 'cytoscape-cxtmenu' {
    const ext: cytoscape.Ext;
    export = ext;
}
在控制台中,在播放过程中,我得到以下信息:

ERROR in [at-loader] ./src/index.ts:152:17
    TS2339: Property 'cxtmenu' does not exist on type 'Core'.

Typescript是Javascript的超集,任何可以作为Javascript使用的代码都可以使用Typescript

您遇到的问题是您正在使用的Javascript库缺少正确的Typescript定义

据我所知,DefinitelyTyped()上没有这个包的类型-一个选项是编写一些并提交一个pull请求。然后,在合并和发布请求后,您可以将它们安装为npm包
@types/cytoscape cxtmenu
(并在此之前将它们作为文件包含在项目中)

或者,您可以将库作为any导入,例如:

const cxtmenu = require('cytoscape-cxtmenu');
这意味着typescript不会在您与该库的交互上执行任何类型检查

根据typescript项目的配置方式,您可能需要执行以下操作:

// @ts-ignore
import * as cxtmenu from "cytoscape-cxtmenu";

是的,你可以用。正如Michael所说,typescript是JS的超级集合。你可以做JS能做的任何事情

我用的是angular 8。从“cytoscape上下文菜单”将其作为上下文菜单导入,
import*


如果库依赖于其他一些js或css文件,则必须将它们添加到
angular.json
文件中您可以使用
as
关键字()将类型
any
分配给您的Cytoscape实例,这样可以防止出现错误。以你的问题为例:

(cy as any).cxtmenu( defaults );

请注意,这是一个黑客。分配一种类型的
any
否定了Typescript的优点,应该避免,但我还没有找到其他解决方案。

请发布您的代码和错误。