diff --git a/packages/vue-language-core/src/generators/template.ts b/packages/vue-language-core/src/generators/template.ts index b9e19574e..df5e4b2e7 100644 --- a/packages/vue-language-core/src/generators/template.ts +++ b/packages/vue-language-core/src/generators/template.ts @@ -603,7 +603,7 @@ export function generate( generateClassScoped(node); } if (componentCtxVar) { - generateEvents(node, componentInstanceVar, componentCtxVar); + generateEvents(node, componentVar, componentInstanceVar, componentCtxVar); } generateSlot(node, startTagOffset); @@ -714,7 +714,7 @@ export function generate( codes.push(`}\n`); } - function generateEvents(node: CompilerDOM.ElementNode, componentInstanceVar: string, componentCtxVar: string) { + function generateEvents(node: CompilerDOM.ElementNode, componentVar: string, componentInstanceVar: string, componentCtxVar: string) { for (const prop of node.props) { if ( @@ -725,7 +725,7 @@ export function generate( const eventVar = `__VLS_${elementIndex++}`; codes.push( `let ${eventVar} = { '${prop.arg.loc.source}': `, - `(await import('./__VLS_types')).pickEvent(${componentCtxVar}.emit!, '${prop.arg.loc.source}' as const, ${componentInstanceVar}.__props!`, + `(await import('./__VLS_types')).pickEvent(${componentCtxVar}.emit!, '${prop.arg.loc.source}' as const, (await import('./__VLS_types')).componentProps(${componentVar}, ${componentInstanceVar})`, ...createPropertyAccessCode([ camelize('on-' + prop.arg.loc.source), // onClickOutside 'template', diff --git a/packages/vue-language-core/src/utils/localTypes.ts b/packages/vue-language-core/src/utils/localTypes.ts index 6e886e058..60c76be81 100644 --- a/packages/vue-language-core/src/utils/localTypes.ts +++ b/packages/vue-language-core/src/utils/localTypes.ts @@ -102,15 +102,20 @@ export declare function asFunctionalComponent any>(t: T): Parameters['length'] extends 2 ? [any] : []; export declare function pickEvent(emit: Emit, emitKey: K, event: E): FillingEventArg< PickNotAny< - AsFunctionOrAny>, - AsFunctionOrAny>> + AsFunctionOrAny, + AsFunctionOrAny> > >; export declare function pickFunctionalComponentCtx(comp: T, compInstance: K): PickNotAny< K extends { __ctx?: infer Ctx } ? Ctx : any, T extends (props: any, ctx: infer Ctx) => any ? Ctx : any >; -type AsFunctionOrAny = F extends ((...args: any) => any) ? F : any; +type AsFunctionOrAny = unknown extends F ? any : ((...args: any) => any) extends F ? F : any; + +export declare function componentProps(comp: T, fnReturn: K): + PickNotAny extends { __props: infer P } ? NonNullable

+ : T extends (props: infer P, ...args: any) => any ? NonNullable

: + {}; `.trim(); } diff --git a/packages/vue-test-workspace/vue-tsc/#2700/main.vue b/packages/vue-test-workspace/vue-tsc/#2700/main.vue new file mode 100644 index 000000000..bbd75706e --- /dev/null +++ b/packages/vue-test-workspace/vue-tsc/#2700/main.vue @@ -0,0 +1,8 @@ + + +