Javascript JSDoc:Property';价值';不存在于类型';EventTarget';

Javascript JSDoc:Property';价值';不存在于类型';EventTarget';,javascript,typescript,annotations,jsdoc,Javascript,Typescript,Annotations,Jsdoc,我正在结合使用香草JavaScript 这几乎可以完美地工作,尤其是在后端(例如,在NodeJS中使用时) 然而,当我将它用于DOM对象时,事情变得有点棘手 例如:假设我有一个HTML输入字段,我捕获Input事件,并希望使用e.target.value访问输入的值: /** *输入时记录数据 * *@param{Event}e */ let handleEvent=函数(e){ console.log(如target.value); }; document.getElementById(“我的

我正在结合使用香草JavaScript
这几乎可以完美地工作,尤其是在后端(例如,在NodeJS中使用时)

然而,当我将它用于DOM对象时,事情变得有点棘手

例如:假设我有一个HTML输入字段,我捕获
Input
事件,并希望使用
e.target.value
访问输入的值:

/**
*输入时记录数据
*
*@param{Event}e
*/
let handleEvent=函数(e){
console.log(如target.value);
};
document.getElementById(“我的输入”).addEventListener(“输入”,handleEvent);
这将导致TS警告:

类型“EventTarget”上不存在属性“value”

如图所示:

现在我的问题是,什么是正确的
@param
注释

到目前为止,我已经尝试了
Event
InputEvent
HTMLInputElement


我不想用。相反,我想知道如何直接在函数注释中指定它,这样我就不必按照建议分别为
e.target.value
的每次出现设置
@type

您可以这样编写
@param
注释:

/**
*输入时记录数据
*
*@param{Event&{target:HTMLInputElement}}e
*/
let handleEvent=函数(e){
console.log(如target.value);
};
然后,您将获得对正确类型的完全支持:

之所以这样做,是因为您基本上是通过新的目标属性“扩展”了
事件
类,该属性已经存在,因此它会被我们的新类型覆盖


符号本身不是jsdoc运算符,而是来自TypeScript的运算符。因此,只有当您继续使用TypeScript作为预处理器时,这才有效。请参阅以获得更详细的解释。

遗憾的是,键入的字符数不比类型断言少很多。这种方法是合理的,但有一种变通的感觉。不过,如果
Event
/
InputEvent
没有泛型类型参数(而且似乎没有),我不确定您还应该做什么。按键盘上的键表示的“打字”keyboard@T.J.Crowder在我看来,如果在函数体中大量使用
e
,实际上键入的内容会更少。对我来说,这并不是一个解决办法,因为我显式地声明了参数的类型。我能想到的唯一“解决办法”是访问
this
,而不是
e
。尽管如此,我还是对这个解决方案非常满意:)@NullDev-您可以将
target
抓取一次到本地
var target=/**@type{HTMLInputElement}*/(e.target)
但是这个
&
解决方案与使用泛型类型参数几乎相同(实际上,现在我想起来了,我不确定类型参数除了更简洁一点之外还能提供什么),所以看起来相当不错。:-)