microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
100.76k stars 12.46k forks source link

JSDoc parsing provides inconsistent results #54416

Closed AnrDaemon closed 1 year ago

AnrDaemon commented 1 year ago

Type: Bug

/** Simple JS event handler
 *
 * @param {{ target: HTMLInputElement, } & CustomEvent} event The trigger event.
 */
function changeHandler(event) {
    if (event.target.checked) return;
}

This setup provides the following hint at the event.target property:

(property) target: HTMLInputElement & EventTarget
Returns the object to which event is dispatched (its target).

And then, event.target.checked correctlly resolved to HTMLInputElement::checked.

But when I modify docblock to @param {{ target: HTMLInputElement, } & JQuery.EventBase} event The trigger event. it will no longer see an override and .target.checked resolves to any.

Tested with extensions disabled, to the same effect.

VS Code version: Code 1.78.2 (b3e4e68a0bc097f0ae7907b217c1119af9e03435, 2023-05-10T14:39:26.248Z) OS version: Windows_NT x64 10.0.19045 Modes: Sandboxed: No

System Info |Item|Value| |---|---| |CPUs|Intel(R) Core(TM) i3-8145U CPU @ 2.10GHz (4 x 2304)| |GPU Status|2d_canvas: enabled
canvas_oop_rasterization: disabled_off
direct_rendering_display_compositor: disabled_off_ok
gpu_compositing: enabled
multiple_raster_threads: enabled_on
opengl: enabled_on
rasterization: enabled
raw_draw: disabled_off_ok
video_decode: enabled
video_encode: enabled
vulkan: disabled_off
webgl: enabled
webgl2: enabled
webgpu: enabled| |Load (avg)|undefined| |Memory (System)|7.86GB (0.38GB free)| |Process Argv|--folder-uri file:///d%3A/Profiles/anrdaemon/Documents/hk/invapi-php| |Screen Reader|no| |VM|0%|
Extensions (27) Extension|Author (truncated)|Version ---|---|--- vscode-json|and|1.5.2 vscode-intelephense-client|bme|1.9.5 vscode-eslint|dba|2.4.0 gitlens|eam|13.6.0 vscode-html-css|ecm|1.13.1 EditorConfig|Edi|0.16.4 vscode-firefox-debug|fir|2.9.8 todo-tree|Gru|0.0.226 composer|ika|0.8.0 better-shellscript-syntax|jef|1.6.1 jupyter|ms-|2023.4.1011241018 jupyter-keymap|ms-|1.1.0 jupyter-renderers|ms-|1.0.15 vscode-jupyter-cell-tags|ms-|0.1.8 vscode-jupyter-slideshow|ms-|0.1.5 remote-ssh|ms-|0.102.0 remote-ssh-edit|ms-|0.86.0 hexeditor|ms-|1.9.11 remote-explorer|ms-|0.4.0 sqltools|mtx|0.27.1 sqltools-driver-mysql|mtx|0.5.1 php-docblocker|nei|2.7.0 tcl|ras|0.1.0 LiveServer|rit|5.7.9 html-to-css-autocompletion|sol|1.1.2 branch-in-window-title|wis|0.1.4 php-debug|xde|1.32.1
AnrDaemon commented 1 year ago

jsconfig for reference:

{
    "typeAcquisition": {
        "include": [
            "jquery",
            "jqueryui",
            "popper.js",
            "bootstrap"
        ]
    },
    "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "Node",
        "target": "ES2020",
        "jsx": "react",
        "strictNullChecks": true,
        "strictFunctionTypes": true
    },
    "exclude": [
        "node_modules",
        "**/node_modules/*"
    ]
}
mjbvz commented 1 year ago

The JQuery.EventBase typings explicitly type the target as any if you don't provide your own typings. You can check the definition of EventBase to see this

Screenshot 2023-05-26 at 1 03 20 PM

Instead you likely need to pass in the type of target explicitly:

 * @param {{ target: HTMLInputElement } &  JQuery.EventBase<any, any, any, HTMLInputElement>} event The trigger event.
AnrDaemon commented 1 year ago

That's nice. I did not know of this possibility.

But then a simple @param {JQuery.EventBase<any, any, HTMLInputElement, HTMLInputElement>} event The change event. would suffice.