diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index 557f6ec5d93..1f72770a927 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -1467,6 +1467,26 @@ describe('resolveType', () => { }) }) + test('declare global with indexed access type', () => { + const files = { + '/global.d.ts': ` + declare global { + type Options = { + code: { + selected: boolean + } + } + }`, + } + const { props } = resolve(`defineProps()`, files, { + globalTypeFiles: Object.keys(files), + }) + + expect(props).toStrictEqual({ + selected: ['Boolean'], + }) + }) + // #9871 test('shared generics with different args', () => { const files = { diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 9cb4ce8e7c2..2cfd627d7be 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1388,6 +1388,18 @@ function recordType( case 'TSInterfaceDeclaration': case 'TSEnumDeclaration': case 'TSModuleDeclaration': { + // Handle `declare global { ... }` blocks by recursively processing their contents + if (node.type === 'TSModuleDeclaration' && node.global) { + const body = node.body as TSModuleBlock + for (const s of body.body) { + if (s.type === 'ExportNamedDeclaration' && s.declaration) { + recordType(s.declaration, types, declares) + } else { + recordType(s, types, declares) + } + } + break + } const id = overwriteId || getId(node.id) let existing = types[id] if (existing) {