如何让 VS Code 智能感知识别附加到现有类的新方法

Posted

技术标签:

【中文标题】如何让 VS Code 智能感知识别附加到现有类的新方法【英文标题】:How to let VS Code intellisense recognize new methods appended to existing class 【发布时间】:2018-11-26 15:06:09 【问题描述】:

我正在尝试在 CanvasRenderingContext2D 类(它是画布元素的上下文对象)上定义新方法。例如,

CanvasRenderingContext2D.prototype.dot=function(x, y) 
    ....

将是一种在 (x, y) 坐标处绘制具有特定样式的点的新方法(函数内的确切代码与我的问题无关)。我的问题是,如何让 VS 代码智能感知这现在是 CanvasRenderingContext2D 的新方法?我尝试过类似

/**
 * Draws a dot at the (x, y) coordinate
 * @memberof CanvasRenderingContext2D#
 * @param number x 
 * @param number y 
 */

但它不起作用,当我写下 CanvasRenderingContext2D 的实例时,智能感知中仍然只显示原始成员。我如何使它工作?谢谢!

【问题讨论】:

【参考方案1】:

似乎没有人有答案;在那种情况下,让我为可能有相同需求的人提供部分答案。可以在项目文件夹中新建一个 lib.es6.d.ts 文件,然后添加

interface CanvasRenderingContext2D extends CanvasPathMethods 
    dot(x:number, y:number):void;

声明新的点方法;这足以让智能感知在CanvasRenderingContext2D 的任何实例之后显示它。但是,这并不是一个完整的答案,因为无法转到点方法的实际定义(使用“转到定义”只会转到所述 .d.ts 文件,而不是代码实际所在的位置)。

即使我使用 TypeScript 而不是 javascript 重写整个项目,我仍然找不到解决“转到定义”问题的方法。但是,我可以将声明置于尽可能接近方法的实际代码的位置,以便“转到定义”实际上可行,即使在技术上不是这样。

【讨论】:

【参考方案2】:

您需要像这样使用自定义@typedef:

/**
 * Draws a dot at the (x, y) coordinate
 * @param number x 
 * @param number y 
 */
const dot=function(x, y) 

CanvasRenderingContext2D.prototype.dot = dot;

/** @typedef CanvasRenderingContext2D &  dot: dot  MyCanvasRenderingContext2D */

/** @type MyCanvasRenderingContext2D */
const o = new CanvasRenderingContext2D();
o.dot();

【讨论】:

您的解决方案的主要缺点是您必须在CanvasRenderingContext2D 的每个实例上方手动声明为MyCanvasRenderingContext2D。但是,它确实解决了“去定义”的问题,我会给你投票(你可能看不到,我没有足够的代表)。

以上是关于如何让 VS Code 智能感知识别附加到现有类的新方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VS Code 中为模板中的 vue 道具启用 Typescript 打字和智能感知?

VS Code 中的 jQuery 智能感知

vs code 智能感知结果仅限于 1

如何在复制粘贴时覆盖 VS Code 中的文件(而不是将 *.1* 附加到文件名)?

VS Code 中 Javascript 的自动补全/建议/智能感知

VS 2013 中的 Dojo 自定义模块智能感知