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

Nul*_*Dev 4 javascript annotations jsdoc typescript

我正在使用带有TypeScript 的vanilla JavaScript作为预处理器JSDoc结合使用。
这几乎完美无缺,尤其是在后端(例如在 NodeJS 中使用时)。

但是,当我将它与 DOM 对象一起使用时,事情变得有点棘手。

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

/**
 * Log data on input
 *
 * @param {Event} e
 */
let handleEvent = function(e){
    console.log(e.target.value);
};

document.getElementById("my-input").addEventListener("input", handleEvent);
Run Code Online (Sandbox Code Playgroud)

这会导致 TS 警告:

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

如这里所见:

打字稿警告

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

到目前为止,我已经尝试过EventInputEvent并且HTMLInputElement

我不想使用Type-Assertion。相反,我想知道如何直接在函数注释中指定它,因此我不必按照此处的建议@type为每个出现的事件e.target.value单独设置。

Cre*_*ore 7

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

/**
 * Log data on input
 *
 * @param {Event & { target: HTMLInputElement }} e
 */
let handleEvent = function(e){
    console.log(e.target.value);
};
Run Code Online (Sandbox Code Playgroud)

然后您将获得对正确类型的全面支持:

1

这之所以有效,是因为您基本上是Event通过新的目标属性“扩展”类 - 它已经存在,因此它会被我们的新类型覆盖。

&符号本身不是 jsdoc 运算符,而是来自 TypeScript 的运算符。所以这只有在你继续使用 TypeScript 作为你的预处理器时才有效。见对于更详细的解释。

  • 正如您所提到的,它只适用于 TypeScript,而不是仅适用于 JSDoc 的纯 JS。在这种情况下,该技巧适用于该函数,但在“addEventListener(handleEvent)”中调用它时则不起作用。假设我们要使用 target 和originalTarget。JSDoc 在参数上输出此错误: **“MouseEvent”类型的参数不能分配给“MouseEvent & {originalTarget: HTMLInputElement; 类型的参数” 目标:HTMLInputElement;}'。类型“MouseEvent”中缺少属性“originalTarget”,但类型“{originalTarget: HTMLInputElement;”中需要属性“originalTarget” 目标:HTMLInputElement;}'.ts(2345)** (3认同)