如何在VSCode中使用JSDoc @template注释ES5类,以防止出现checkJS错误?

时间:2018-11-16 17:40:40

标签: javascript visual-studio-code annotations jsdoc checkjs

我试图用JSDoc注释我的所有JavaScript函数和类属性,以使用TypeScript和checkJS选项启用正确的类型检查。

但是,由于我想支持较旧的浏览器(IE9),并且我不想使用Babel来转换代码,因此我需要使用ES5-era JavaScript,并且不能使用“类”来定义类。因此,我需要求助于简单的旧函数原型。

在我正在研究的项目中,我有以下课程:

/**
 * A condition class, executes a set function on results that meet their required conditions.
 * @class
 * @template T
 */
function Condition()
{
  /** @type {{condition?: boolean, result: T}[]} A list of conditions to execute. */
  this.list = new Array();
}

/** 
 * Adds a condition
 * @param {{condition: boolean, result: T}} condition The object with the condition and the result to be sent to the executing function.
 */
Condition.prototype.add = function(condition)
{
  this.list.push(condition);
}

/**
 * Executes the added conditions.
 * @param {function(T):void} action The function to be executed when a condition is true.
 */
Condition.prototype.execute = function(action)
{
  this.list.forEach(function(condition) { if(condition.condition) action(condition.result); });
}

在此类中,result元素在同一类实例内始终具有相同的类型,这使得它成为模板的完美用例,如代码所示。

但是,当我尝试使用例如以下代码来使用该类时:

var conditionList = /**@type {Condition<string>} */(new Condition());
conditionList.add({ condition: true, result: 'yes' });
conditionList.execute(function(value) { console.log(value); });

我在VSCode中遇到以下错误:

Type 'string' is not assignable to type 'T'. The expected type comes from property 'result' which is declared here on type '{ condition: boolean; result: T; }'

当我将鼠标悬停在conditionList上时,弹出窗口会显示:var conditionList: typeof Condition

conditionList声明更改为var /**@type {typeof Condition<string>} */(new Condition());也不起作用,并且抛出错误,指出typeof Condition无法转换为typeof Condition

因此,在保持ES5类声明样式的同时,我不知道如何做才能使模板正常工作。

但是,如果我将代码转换为ES6样式的类(class Condition),并且按原样保留注释,则代码可以正常工作。在这种情况下,将鼠标悬停在conditionList上会弹出var conditionList: Condition<string>,并且没有错误。

是否可以使用ES5样式类获得相同的行为?我想念什么吗?还是在VSCode的TypeScript检查器中未实现?

1 个答案:

答案 0 :(得分:0)

这似乎是一个错误,在Github中有一个未解决的问题。不幸的是,直到TypeScript 3.3发布,它似乎都无法修复:

https://github.com/Microsoft/TypeScript/issues/26883