【问题标题】:JSDoc: Property 'value' does not exist on type 'EventTarget'JSDoc:“EventTarget”类型上不存在属性“值”
【发布时间】:2021-05-18 05:59:23
【问题描述】:

我正在使用带有 TypeScript as pre-processorJSDoc 的 vanilla JavaScript。
这几乎可以完美运行,尤其是在后端(例如在 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);

这会导致 TS 警告:

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

如下所示:

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

到目前为止,我已经尝试过 EventInputEventHTMLInputElement

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

【问题讨论】:

    标签: javascript typescript annotations jsdoc


    【解决方案1】:

    你可以这样写你的@param注解:

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

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

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

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

    【讨论】:

    • 可悲的是,键入¹并没有比类型断言少多少。这种方法是合理的,但它有一种变通方法的感觉。不过,如果Event/InputEvent 没有泛型类型参数(而且似乎没有),我不确定你还能做什么。 ¹ 在键盘上按键的意义上的“打字”
    • @T.J.Crowder Imo 如果您在函数体中大量使用e,实际上打字会更少。因为我明确说明了参数的类型,所以我觉得这不是一种解决方法。我能想到的唯一“解决方法”是访问this 而不是e。尽管如此,我对这个解决方案很满意 :)
    • @NullDev - 你会抓住target 到本地,一次。 var target = /** @type {HTMLInputElement} */ (e.target); 但是这个& 解决方案非常与使用泛型类型参数几乎相同(实际上,现在我想一想,我不确定类型参数会提供什么更简洁),所以看起来还不错。 :-)
    • 正如你所提到的,它只适用于 TypeScript,而不是纯 JS 只适用于 JSDoc。在这种情况下,该技巧适用于该函数,但在 addEventListener( handleEvent ) 中调用它时无效。假设我们要使用 target 和 originalTarget。 JSDoc 在参数上输出此错误:“MouseEvent”类型的参数不可分配给“MouseEvent”类型的参数 & { originalTarget: HTMLInputElement;目标:HTMLInputElement; }'。 “MouseEvent”类型中缺少属性“originalTarget”,但在“{ originalTarget: HTMLInputElement;目标:HTMLInputElement; }'.ts(2345)
    猜你喜欢
    • 2017-06-23
    • 2021-06-03
    • 2021-05-27
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多