我正尝试在类CanvasRenderingContext2D (它是canvas元素的上下文对象)上定义新方法。例如,
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的一个实例时,仍然只有原始成员显示在智能感知中。我该如何让它工作呢?谢谢!
发布于 2018-07-13 14:19:51
似乎没有人有答案;在这种情况下,让我为那些可能有相同需求的人提供部分答案。用户可以在项目文件夹中创建一个新的lib.es6.d.ts文件,然后添加
interface CanvasRenderingContext2D extends CanvasPathMethods {
dot(x:number, y:number):void;
}
声明新的点方法;这足以让智能感知在CanvasRenderingContext2D
的任何实例之后显示它。然而,这并不是一个完整的答案,因为我们不能转到点方法的实际定义(使用“转到定义”将只转到上述.d.ts文件,而不是代码实际所在的位置)。
即使我使用TypeScript而不是JavaScript重写整个项目,我仍然找不到一种方法来解决“转到定义”的问题。但是,我可以将声明尽可能地接近方法的实际代码,这样“转到定义”实际上就可以工作,即使在技术上不是这样。
发布于 2018-08-03 05:59:43
你需要的是像这样使用一个自定义的@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();
https://stackoverflow.com/questions/50898110
复制相似问题