我试图用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检查器中未实现?
答案 0 :(得分:0)
这似乎是一个错误,在Github中有一个未解决的问题。不幸的是,直到TypeScript 3.3发布,它似乎都无法修复: