From d6cde46cc900f39ad146e1e4528500aaa91d2d91 Mon Sep 17 00:00:00 2001 From: KazariEX Date: Wed, 7 Jan 2026 22:41:38 +0800 Subject: [PATCH 1/2] fix: do not infer object keys as string literals in `v-for` --- packages/language-core/types/template-helpers.d.ts | 13 ++++++++----- test-workspace/tsc/v-for/main.vue | 14 +++++++++++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/language-core/types/template-helpers.d.ts b/packages/language-core/types/template-helpers.d.ts index 8382687cd7..c460d41e3b 100644 --- a/packages/language-core/types/template-helpers.d.ts +++ b/packages/language-core/types/template-helpers.d.ts @@ -4,6 +4,7 @@ declare global { type __VLS_Elements = __VLS_SpreadMerge; type __VLS_IsAny = 0 extends 1 & T ? true : false; type __VLS_PickNotAny = __VLS_IsAny extends true ? B : A; + type __VLS_IsEnum = T extends string | number ? string | number extends T ? false : true : false; type __VLS_SpreadMerge = Omit & B; type __VLS_WithComponent< N0 extends string, @@ -106,11 +107,13 @@ declare global { }; type __VLS_PrettifyGlobal = (T extends any ? { [K in keyof T]: T[K] } : { [K in keyof T as K]: T[K] }) & {}; - function __VLS_vFor(source: T): T extends number ? [number, number][] - : T extends string ? [string, number][] - : T extends (infer U)[] ? [U, number][] - : T extends Iterable ? [V, number][] - : [T[keyof T], `${keyof T & (string | number)}`, number][]; + function __VLS_vFor(source: T): ( + T extends number ? [number, number] + : T extends string ? [string, number] + : T extends (infer U)[] ? [U, number] + : T extends Iterable ? [V, number] + : [T[keyof T], Exclude, number] + )[]; function __VLS_vSlot(slot: S, decl?: D): D extends (...args: infer P) => any ? P : any[]; function __VLS_asFunctionalDirective( dir: T, diff --git a/test-workspace/tsc/v-for/main.vue b/test-workspace/tsc/v-for/main.vue index 1bc771c340..1cce37f947 100644 --- a/test-workspace/tsc/v-for/main.vue +++ b/test-workspace/tsc/v-for/main.vue @@ -40,7 +40,7 @@
{{ exactType(val, {} as string) }} - {{ exactType(key, {} as '1' | '2' | '3') }} + {{ exactType(key, {} as 1 | 2 | 3) }} {{ exactType(index, {} as number) }}
@@ -49,6 +49,12 @@ {{ exactType(key, {} as 'a' | 'b') }} {{ exactType(index, {} as number) }} + +
+ {{ exactType(val, {} as string) }} + {{ exactType(key, {} as Enum) }} + {{ exactType(index, {} as number) }} +
{{ exactType(val, {} as any) }} @@ -59,6 +65,11 @@ From 6ee1ddec496d3df05b19d54e4ef0320f64279949 Mon Sep 17 00:00:00 2001 From: KazariEX Date: Wed, 7 Jan 2026 22:46:14 +0800 Subject: [PATCH 2/2] chore: lint --- packages/language-core/types/template-helpers.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/language-core/types/template-helpers.d.ts b/packages/language-core/types/template-helpers.d.ts index c460d41e3b..16f840397d 100644 --- a/packages/language-core/types/template-helpers.d.ts +++ b/packages/language-core/types/template-helpers.d.ts @@ -4,7 +4,6 @@ declare global { type __VLS_Elements = __VLS_SpreadMerge; type __VLS_IsAny = 0 extends 1 & T ? true : false; type __VLS_PickNotAny = __VLS_IsAny extends true ? B : A; - type __VLS_IsEnum = T extends string | number ? string | number extends T ? false : true : false; type __VLS_SpreadMerge = Omit & B; type __VLS_WithComponent< N0 extends string,