diff --git a/packages/vue-language-core/schemas/vue-tsconfig.schema.json b/packages/vue-language-core/schemas/vue-tsconfig.schema.json index 1d938859f..adfa891f1 100644 --- a/packages/vue-language-core/schemas/vue-tsconfig.schema.json +++ b/packages/vue-language-core/schemas/vue-tsconfig.schema.json @@ -19,6 +19,11 @@ "default": [ ".vue" ], "markdownDescription": "Valid file extensions that should be considered as regular Vue SFC, please note that you should not use this option separately for additional file extensions IDE support, see https://github.com/johnsoncodehk/volar/tree/master/packages/vscode-vue/README.md#custom-file-extensions." }, + "jsxSlots": { + "type": "boolean", + "default": false, + "markdownDescription": "Generate slots type for `JSX.ElementChildrenAttribute`." + }, "strictTemplates": { "type": "boolean", "default": false, diff --git a/packages/vue-language-core/src/generators/script.ts b/packages/vue-language-core/src/generators/script.ts index a89ad83aa..b8bb16006 100644 --- a/packages/vue-language-core/src/generators/script.ts +++ b/packages/vue-language-core/src/generators/script.ts @@ -142,11 +142,17 @@ export function generate( } } if (usedHelperTypes.WithTemplateSlots) { - usedHelperTypes.PropsChildren = true; - codes.push(`type __VLS_WithTemplateSlots = T & { new(): { - $slots: S; - $props: __VLS_PropsChildren; - } };\n`); + codes.push( + `type __VLS_WithTemplateSlots = T & { new(): {\n`, + `$slots: S;\n`, + ); + if (vueCompilerOptions.jsxSlots) { + usedHelperTypes.PropsChildren = true; + codes.push(`$props: __VLS_PropsChildren;\n`); + } + codes.push( + `} };\n`, + ); } if (usedHelperTypes.ToTemplateSlots) { codes.push(`type __VLS_ToTemplateSlots = { [K in keyof T]: NonNullable extends (...args: any[]) => any ? T[K] : (props: T[K]) => any };\n`); @@ -354,7 +360,7 @@ export function generate( } codes.push(`};\n`); } - if (scriptSetupRanges.slotsTypeArg) { + if (scriptSetupRanges.slotsTypeArg && vueCompilerOptions.jsxSlots) { usedHelperTypes.ToTemplateSlots = true; usedHelperTypes.PropsChildren = true; codes.push(` & __VLS_PropsChildren<__VLS_ToTemplateSlots<`); @@ -365,7 +371,7 @@ export function generate( } else { codes.push(`const __VLS_props: {}`); - if (scriptSetupRanges.slotsTypeArg) { + if (scriptSetupRanges.slotsTypeArg && vueCompilerOptions.jsxSlots) { usedHelperTypes.ToTemplateSlots = true; usedHelperTypes.PropsChildren = true; codes.push(` & __VLS_PropsChildren<__VLS_ToTemplateSlots<`); diff --git a/packages/vue-language-core/src/types.ts b/packages/vue-language-core/src/types.ts index f08678910..88ff2f373 100644 --- a/packages/vue-language-core/src/types.ts +++ b/packages/vue-language-core/src/types.ts @@ -19,6 +19,7 @@ export type RawVueCompilerOptions = Partial