diff --git a/packages/vscode-vue-languageservice/src/generators/template.ts b/packages/vscode-vue-languageservice/src/generators/template.ts
index f5dca33f19..9b7f282689 100644
--- a/packages/vscode-vue-languageservice/src/generators/template.ts
+++ b/packages/vscode-vue-languageservice/src/generators/template.ts
@@ -75,10 +75,10 @@ export function generate(
 		}>,
 	}> = {};
 	const tagResolves: Record<string, {
-		name: string,
 		rawComponent: string,
 		baseProps: string,
 		emit: string,
+		slots: string,
 		events: Record<string, string>,
 		offsets: number[],
 	}> = {};
@@ -94,6 +94,7 @@ export function generate(
 		const var_rawComponent = `__VLS_${elementIndex++}`;
 		const var_baseProps = `__VLS_${elementIndex++}`;
 		const var_emit = `__VLS_${elementIndex++}`;
+		const var_slots = `__VLS_${elementIndex++}`;
 		const var_events: Record<string, string> = {};
 
 		tsCodeGen.addText(`declare const ${var_correctTagName}: __VLS_GetComponentName<typeof __VLS_rawComponents, '${tag}'>;\n`);
@@ -101,6 +102,10 @@ export function generate(
 		tsCodeGen.addText(`declare const ${var_rawComponent}: __VLS_GetProperty<typeof __VLS_rawComponents, typeof ${var_correctTagName}, any>;\n`);
 		tsCodeGen.addText(`declare const ${var_baseProps}: __VLS_ExtractComponentProps<typeof ${var_rawComponent}>;\n`);
 		tsCodeGen.addText(`declare const ${var_emit}: __VLS_ExtractEmit2<typeof ${var_rawComponent}>;\n`);
+		tsCodeGen.addText(`declare const ${var_slots}: 
+			__VLS_TemplateSlots<typeof ${var_wrapComponent}>
+			& __VLS_ScriptSlots<typeof ${var_rawComponent}>
+			& __VLS_DefaultSlots<typeof ${var_wrapComponent}, typeof ${var_rawComponent}>;\n`);
 
 		const resolvedTag = tags[tag];
 		const tagRanges = resolvedTag.offsets.map(offset => ({ start: offset, end: offset + tag.length }));
@@ -212,10 +217,10 @@ export function generate(
 		}
 
 		tagResolves[tag] = {
-			name: var_correctTagName,
 			rawComponent: var_rawComponent,
 			baseProps: var_baseProps,
 			emit: var_emit,
+			slots: var_slots,
 			events: var_events,
 			offsets: tags[tag].offsets.map(offset => htmlToTemplate(offset, offset)).filter(shared.notEmpty),
 		};
@@ -1123,7 +1128,7 @@ export function generate(
 					slotName = prop.arg.content;
 				}
 				const diagStart = tsCodeGen.getText().length;
-				tsCodeGen.addText(`({ ...__VLS_getTemplateSlots(__VLS_wrapComponents[${tagResolves[parentEl.tag].name}]), ...__VLS_getScriptSlots(__VLS_rawComponents[${tagResolves[parentEl.tag].name}])})`);
+				tsCodeGen.addText(tagResolves[parentEl.tag].slots);
 				const argRange = prop.arg
 					? {
 						start: prop.arg.loc.start.offset,
diff --git a/packages/vscode-vue-languageservice/src/utils/globalDoc.ts b/packages/vscode-vue-languageservice/src/utils/globalDoc.ts
index 2344e8da36..217ce15cdf 100644
--- a/packages/vscode-vue-languageservice/src/utils/globalDoc.ts
+++ b/packages/vscode-vue-languageservice/src/utils/globalDoc.ts
@@ -79,8 +79,13 @@ declare global {
 	function __VLS_directiveFunction<T>(dir: T): T extends ObjectDirective<infer E, infer V> ? V extends { value: infer V_2 } ? (value: V_2) => void : (value: V) => void
 		: T extends FunctionDirective<infer E, infer V> ? V extends { value: infer V_2 } ? (value: V_2) => void : (value: V) => void : T;
 
-	function __VLS_getTemplateSlots<T>(t: T): T extends { __VLS_slots: infer S } ? S : {};
-	function __VLS_getScriptSlots<T>(t: T): T extends new (...args: any) => { $slots?: infer S } ? (S extends object ? S : {}) : {};
+	type __VLS_TemplateSlots<T> = T extends { __VLS_slots: infer S } ? S : {};
+	type __VLS_ScriptSlots<T> = T extends new (...args: any) => { $slots?: infer S }
+		? { [K in keyof S]: S[K] extends (obj: infer O) => any ? O : S[K] }
+		: {};
+	type __VLS_DefaultSlots<W, R> = W extends { __VLS_slots: infer _ }
+		? {} : R extends new (...args: any) => { $slots?: infer _ }
+		? {} : Record<string, any>;
 
 	type __VLS_GetComponentName<T, K extends string> = K extends keyof T ? IsAny<T[K]> extends false ? K : __VLS_GetComponentName_CamelCase<T, CamelCase<K>> : __VLS_GetComponentName_CamelCase<T, CamelCase<K>>;
 	type __VLS_GetComponentName_CamelCase<T, K extends string> = K extends keyof T ? IsAny<T[K]> extends false ? K : __VLS_GetComponentName_CapitalCase<T, Capitalize<K>> : __VLS_GetComponentName_CapitalCase<T, Capitalize<K>>;