Skip to content

Commit e0fb9e8

Browse files
feat(language-core): revert overcorrects v-for type inference (#5836)
1 parent 9f97787 commit e0fb9e8

File tree

7 files changed

+31
-29
lines changed

7 files changed

+31
-29
lines changed

packages/language-core/lib/codegen/globalTypes.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -140,20 +140,13 @@ export function generateGlobalTypes(options: VueCompilerOptions) {
140140
type __VLS_UseTemplateRef<T> = Readonly<import('${lib}').ShallowRef<T | null>>;
141141
type __VLS_ProxyRefs<T> = import('${lib}').ShallowUnwrapRef<T>;
142142
143-
function __VLS_getVForSourceType<T extends number | string | any[] | Iterable<any>>(source: T): [
144-
item: T extends number ? number
145-
: T extends string ? string
146-
: T extends any[] ? T[number]
147-
: T extends Iterable<infer T1> ? T1
148-
: any,
149-
index: number,
150-
][];
151-
function __VLS_getVForSourceType<T>(source: T): [
152-
item: T[keyof T],
153-
key: keyof T,
154-
index: number,
155-
][];
156-
function __VLS_getSlotParameters<S, D extends S>(slot: S, decl?: D):
143+
function __VLS_vFor<T>(source: T):
144+
T extends number ? [number, number][]
145+
: T extends string ? [string, number][]
146+
: T extends any[] ? [T[number], number][]
147+
: T extends Iterable<infer V> ? [V, number][]
148+
: [T[keyof T], keyof T, number][];
149+
function __VLS_vSlot<S, D extends S>(slot: S, decl?: D):
157150
D extends (...args: infer P) => any ? P : any[];
158151
function __VLS_asFunctionalDirective<T>(dir: T): T extends import('${lib}').ObjectDirective
159152
? NonNullable<T['created' | 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted']>

packages/language-core/lib/codegen/template/vFor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export function* generateVFor(
3030
}
3131
yield `] of `;
3232
if (source.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
33-
yield `__VLS_getVForSourceType(`;
33+
yield `__VLS_vFor(`;
3434
yield* generateInterpolation(
3535
options,
3636
ctx,

packages/language-core/lib/codegen/template/vSlot.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ function* generateSlotParameters(
139139

140140
yield `const [`;
141141
yield* interpolation;
142-
yield `] = __VLS_getSlotParameters(${slotVar}!`;
142+
yield `] = __VLS_vSlot(${slotVar}!`;
143143

144144
if (types.some(t => t)) {
145145
yield `, `;

test-workspace/tsc/passedFixtures/vue3/#2758/child.vue

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
<template>
22
<slot />
33
<template v-for="(value, key) of ({} as T)">
4-
<slot
5-
v-if="typeof key === 'string'"
6-
:name="`cell:${key}`"
7-
:value="value"
8-
/>
4+
<slot v-if="typeof key === 'string'" :name="`cell:${key}`" :value="(value as T[keyof T])" />
95
</template>
106
</template>
117

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script setup lang="ts">
2+
import { ref } from 'vue';
3+
4+
interface Item {
5+
id: number | string
6+
}
7+
interface InfoObj {
8+
[key: string]: Item
9+
}
10+
const data = ref<Item[] | InfoObj>([])
11+
</script>
12+
13+
<template>
14+
<div v-for="item in data">{{ item.id }}</div>
15+
</template>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<template>
22
<div v-for="(val, key) in ({} as T)">
3-
{{ exactType(val, {} as T[keyof T]) }}
4-
{{ exactType(key, {} as keyof T) }}
3+
{{ exactType(val, {} as string | boolean) }}
4+
{{ exactType(key, {} as string | number) }}
55
</div>
66
</template>
77

8-
<script lang="ts" setup generic="T extends Record<string, string>">
8+
<script lang="ts" setup generic="T extends Record<string, string> | boolean[]">
99
import { exactType } from '../../shared';
1010
</script>

test-workspace/tsc/passedFixtures/vue3/v-for/main.vue

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@
2727
</div>
2828
<!-- objUnion -->
2929
<div v-for="(val, key, index) in objUnion">
30-
<!-- {{ exactType(val, {} as string | number) }} -->
31-
{{ exactType(val, {} as string) }}
32-
<!-- {{ exactType(key, {} as 'a' | 'b') }} -->
33-
{{ exactType(key, {} as 'a') }}
30+
{{ exactType(val, {} as string | number) }}
31+
{{ exactType(key, {} as 'a' | 'b') }}
3432
{{ exactType(index, {} as number) }}
3533
</div>
3634
<!-- record -->
@@ -42,7 +40,7 @@
4240
<!-- any -->
4341
<div v-for="(val, index) in _any">
4442
{{ exactType(val, {} as any) }}
45-
{{ exactType(index, {} as number) }}
43+
{{ exactType(index, {} as string | number | symbol) }}
4644
</div>
4745
</template>
4846

0 commit comments

Comments
 (0)