Closed
Description
Vue - Official extension or vue-tsc version
3
VSCode version
latest
Vue version
3.5
TypeScript version
5.8.3
System Info
System: OS: macOS 15.5 CPU: (12) arm64 Apple M3 Pro Memory: 285.34 MB / 36.00 GB Shell: 5.9 - /bin/zsh Binaries: Node: 22.14.0 - ~/.local/state/fnm_multishells/99960_1750819359200/bin/node Yarn: 1.22.22 - ~/.local/state/fnm_multishells/99960_1750819359200/bin/yarn npm: 10.9.2 - ~/.local/state/fnm_multishells/99960_1750819359200/bin/npm pnpm: 9.0.2 - /opt/homebrew/bin/pnpm bun: 1.1.4 - /opt/homebrew/bin/bun Browsers: Chrome: 138.0.7204.51 Safari: 18.5
package.json dependencies
{ "dependencies": { "@vue/tsconfig": "^0.7.0", "typescript": "^5.8.3", "vue": "^3.5.13", "vue-tsc": "^3.0.0" }, "scripts": { "build": "vue-tsc --noEmit" } }
Steps to reproduce
Description
When using nested component wrappers, the @click
event is not properly propagated through the component chain, resulting in a "missing event" error.
Component Structure
Component C (uses Component B) ↓ Component B (wraps Component A) ↓ Component A (wraps Button) ↓ Button (native element)
Issue
The @click
event defined in Component C is throwing a type error
Code Examples
Component A (Button Wrapper)
<template> <button class="btn" :disabled="disabled" :type="type" > <slot /> </button> </template> <script setup lang="ts"> interface Props { disabled?: boolean type?: 'button' | 'submit' | 'reset' } defineProps<Props>() </script>
Component B (Wraps Component A)
<template> <div class="wrapper"> <ComponentA :disabled="disabled" :type="type" :loading="loading" > <slot /> </ComponentA> </div> </template> <script setup lang="ts"> import ComponentA from './ComponentA.vue' interface Props { disabled?: boolean type?: 'button' | 'submit' | 'reset' loading?: boolean } defineProps<Props>() </script>
Component C (Uses Component B)
<template> <ComponentB :disabled="isDisabled" :type="buttonType" :loading="isLoading" @click="handleClick" <-- type error here > Click me </ComponentB> </template> <script setup lang="ts"> import ComponentB from './ComponentB.vue' const isDisabled = ref(false) const buttonType = ref('button') const isLoading = ref(false) const handleClick = () => { console.log('Button clicked!') } </script>
What is expected?
Not expecting a type error in Component C
What is actually happening?
Error
Object literal may only specify known properties, and 'onClick' does not exist in type 'NonNullable<{ readonly disabled?: boolean | undefined; readonly type?: "button" | "submit" | "reset" | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps>'.ts-plugin(2353)
Link to minimal reproduction
No response
Any additional comments?
Great job on v3 btw! Looks great regardless 🎉