diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 06ab7a4bae..1c5fe22d93 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -13,8 +13,8 @@ export function* generateTemplate( ): Generator { yield* generateSetupExposed(options, ctx); yield* generateTemplateCtx(options, ctx, selfType); - yield* generateTemplateComponents(options); - yield* generateTemplateDirectives(options); + yield* generateTemplateComponents(options, ctx); + yield* generateTemplateDirectives(options, ctx); if (options.styleCodegen) { yield* options.styleCodegen.codes; @@ -82,14 +82,20 @@ function* generateTemplateCtx( yield endOfLine; } -function* generateTemplateComponents(options: ScriptCodegenOptions): Generator { - const types: string[] = [`typeof ${names.ctx}`]; +function* generateTemplateComponents( + { script, scriptRanges }: ScriptCodegenOptions, + ctx: ScriptCodegenContext, +): Generator { + const types: string[] = []; - if (options.script && options.scriptRanges?.componentOptions?.components) { - const { components } = options.scriptRanges.componentOptions; + if (ctx.generatedTypes.has(names.SetupExposed)) { + types.push(names.SetupExposed); + } + if (script && scriptRanges?.componentOptions?.components) { + const { components } = scriptRanges.componentOptions; yield `const __VLS_componentsOption = `; yield* generateSfcBlockSection( - options.script, + script, components.start, components.end, codeFeatures.navigation, @@ -98,18 +104,24 @@ function* generateTemplateComponents(options: ScriptCodegenOptions): Generator { - const types: string[] = [`typeof ${names.ctx}`]; +function* generateTemplateDirectives( + { script, scriptRanges }: ScriptCodegenOptions, + ctx: ScriptCodegenContext, +): Generator { + const types: string[] = []; - if (options.script && options.scriptRanges?.componentOptions?.directives) { - const { directives } = options.scriptRanges.componentOptions; + if (ctx.generatedTypes.has(names.SetupExposed)) { + types.push(names.SetupExposed); + } + if (script && scriptRanges?.componentOptions?.directives) { + const { directives } = scriptRanges.componentOptions; yield `const __VLS_directivesOption = `; yield* generateSfcBlockSection( - options.script, + script, directives.start, directives.end, codeFeatures.navigation, @@ -118,7 +130,7 @@ function* generateTemplateDirectives(options: ScriptCodegenOptions): Generator`); } - yield `type __VLS_LocalDirectives = ${types.join(` & `)}${endOfLine}`; + yield `type __VLS_LocalDirectives = ${types.length ? types.join(` & `) : `{}`}${endOfLine}`; yield `let ${names.directives}!: __VLS_LocalDirectives & __VLS_GlobalDirectives${endOfLine}`; } diff --git a/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json b/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json index e3446579f4..5a9db77723 100644 --- a/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json +++ b/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json @@ -16,6 +16,7 @@ "../vue3/#4828", "../vue3/#4878", "../vue3/#5120", + "../vue3/#5840", "../vue3/rootEl", "../vue3/templateRef", "../vue3/templateRef_native", diff --git a/test-workspace/tsc/passedFixtures/vue3/#5840/main.vue b/test-workspace/tsc/passedFixtures/vue3/#5840/main.vue new file mode 100644 index 0000000000..a0ac6e6610 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3/#5840/main.vue @@ -0,0 +1,12 @@ + + +