Skip to content

Commit 5aec717

Browse files
committed
fix(compiler-sfc): handle imported types from default exports
close #8355
1 parent 8b7c04b commit 5aec717

File tree

2 files changed

+57
-3
lines changed

2 files changed

+57
-3
lines changed

packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts

+41
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,47 @@ describe('resolveType', () => {
574574
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
575575
})
576576

577+
test('relative (default export)', () => {
578+
const files = {
579+
'/foo.ts': `export default interface P { foo: string }`,
580+
'/bar.ts': `type X = { bar: string }; export default X`
581+
}
582+
const { props, deps } = resolve(
583+
`
584+
import P from './foo'
585+
import X from './bar'
586+
defineProps<P & X>()
587+
`,
588+
files
589+
)
590+
expect(props).toStrictEqual({
591+
foo: ['String'],
592+
bar: ['String']
593+
})
594+
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
595+
})
596+
597+
test('relative (default re-export)', () => {
598+
const files = {
599+
'/bar.ts': `export { default } from './foo'`,
600+
'/foo.ts': `export default interface P { foo: string }; export interface PP { bar: number }`,
601+
'/baz.ts': `export { PP as default } from './foo'`
602+
}
603+
const { props, deps } = resolve(
604+
`
605+
import P from './bar'
606+
import PP from './baz'
607+
defineProps<P & PP>()
608+
`,
609+
files
610+
)
611+
expect(props).toStrictEqual({
612+
foo: ['String'],
613+
bar: ['Number']
614+
})
615+
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
616+
})
617+
577618
test('relative (dynamic import)', () => {
578619
const files = {
579620
'/foo.ts': `export type P = { foo: string, bar: import('./bar').N }`,

packages/compiler-sfc/src/script/resolveType.ts

+16-3
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,18 @@ function recordTypes(
11441144
stmt.source.value
11451145
)
11461146
Object.assign(scope.exportedTypes, sourceScope.exportedTypes)
1147+
} else if (stmt.type === 'ExportDefaultDeclaration' && stmt.declaration) {
1148+
if (stmt.declaration.type !== 'Identifier') {
1149+
recordType(stmt.declaration, types, declares, 'default')
1150+
recordType(
1151+
stmt.declaration,
1152+
exportedTypes,
1153+
exportedDeclares,
1154+
'default'
1155+
)
1156+
} else if (types[stmt.declaration.name]) {
1157+
exportedTypes['default'] = types[stmt.declaration.name]
1158+
}
11471159
}
11481160
}
11491161
}
@@ -1160,13 +1172,14 @@ function recordTypes(
11601172
function recordType(
11611173
node: Node,
11621174
types: Record<string, Node>,
1163-
declares: Record<string, Node>
1175+
declares: Record<string, Node>,
1176+
overwriteId?: string
11641177
) {
11651178
switch (node.type) {
11661179
case 'TSInterfaceDeclaration':
11671180
case 'TSEnumDeclaration':
11681181
case 'TSModuleDeclaration': {
1169-
const id = getId(node.id)
1182+
const id = overwriteId || getId(node.id)
11701183
let existing = types[id]
11711184
if (existing) {
11721185
if (node.type === 'TSModuleDeclaration') {
@@ -1199,7 +1212,7 @@ function recordType(
11991212
break
12001213
}
12011214
case 'ClassDeclaration':
1202-
types[getId(node.id)] = node
1215+
types[overwriteId || getId(node.id)] = node
12031216
break
12041217
case 'TSTypeAliasDeclaration':
12051218
types[node.id.name] = node.typeAnnotation

0 commit comments

Comments
 (0)