diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index 93bd20879ae..608549de6f3 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -513,6 +513,31 @@ describe('resolveType', () => { }) }) + // #11129 + test('keyof: intersection type', () => { + const { props } = resolve(` + type A = { name: string } + type B = A & { [key: number]: string } + defineProps<{ + foo: keyof B + }>()`) + expect(props).toStrictEqual({ + foo: ['String', 'Number'], + }) + }) + + test('keyof: union type', () => { + const { props } = resolve(` + type A = { name: string } + type B = A | { [key: number]: string } + defineProps<{ + foo: keyof B + }>()`) + expect(props).toStrictEqual({ + foo: ['String', 'Number'], + }) + }) + test('keyof: utility type', () => { const { props } = resolve( ` diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index de44b9a5e7e..c1204a4cd23 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1686,9 +1686,9 @@ export function inferRuntimeType( return inferRuntimeType(ctx, node.typeAnnotation, scope) case 'TSUnionType': - return flattenTypes(ctx, node.types, scope) + return flattenTypes(ctx, node.types, scope, isKeyOf) case 'TSIntersectionType': { - return flattenTypes(ctx, node.types, scope).filter( + return flattenTypes(ctx, node.types, scope, isKeyOf).filter( t => t !== UNKNOWN_TYPE, ) } @@ -1760,14 +1760,15 @@ function flattenTypes( ctx: TypeResolveContext, types: TSType[], scope: TypeScope, + isKeyOf: boolean = false, ): string[] { if (types.length === 1) { - return inferRuntimeType(ctx, types[0], scope) + return inferRuntimeType(ctx, types[0], scope, isKeyOf) } return [ ...new Set( ([] as string[]).concat( - ...types.map(t => inferRuntimeType(ctx, t, scope)), + ...types.map(t => inferRuntimeType(ctx, t, scope, isKeyOf)), ), ), ]