From: linzhe <40790268+linzhe141@users.noreply.github.com> Date: Fri, 16 May 2025 00:32:13 +0000 (+0800) Subject: fix(compiler-sfc): improve type inference for TSTypeAliasDeclaration with better... X-Git-Tag: v3.5.15~27 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cf5a5e0edf0efcab25c27aa2d13eba91f7372d39;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-sfc): improve type inference for TSTypeAliasDeclaration with better runtime type detection (#13245) close #13240 --- diff --git a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap index fce04c8511..11367463cd 100644 --- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap @@ -148,6 +148,27 @@ export default /*@__PURE__*/_defineComponent({ +return { } +} + +})" +`; + +exports[`defineProps > w/ TSTypeAliasDeclaration 1`] = ` +"import { defineComponent as _defineComponent } from 'vue' +type FunFoo = (item: O) => boolean; + type FunBar = FunFoo; + +export default /*@__PURE__*/_defineComponent({ + props: { + foo: { type: Function, required: false, default: () => true }, + bar: { type: Function, required: false, default: () => true } + }, + setup(__props: any, { expose: __expose }) { + __expose(); + + + return { } } diff --git a/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts index 836badb51c..dcf6341a9f 100644 --- a/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts @@ -808,4 +808,30 @@ const props = defineProps({ foo: String }) expect(content).toMatch(`foo: { default: 5.5, type: Number }`) assertCode(content) }) + + test('w/ TSTypeAliasDeclaration', () => { + const { content } = compile(` + + `) + assertCode(content) + expect(content).toMatch( + `foo: { type: Function, required: false, default: () => true }`, + ) + expect(content).toMatch( + `bar: { type: Function, required: false, default: () => true }`, + ) + }) }) diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 6bb647f11f..1f3c4d6837 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1554,6 +1554,14 @@ export function inferRuntimeType( case 'TSTypeReference': { const resolved = resolveTypeReference(ctx, node, scope) if (resolved) { + if (resolved.type === 'TSTypeAliasDeclaration') { + return inferRuntimeType( + ctx, + resolved.typeAnnotation, + resolved._ownerScope, + isKeyOf, + ) + } return inferRuntimeType(ctx, resolved, resolved._ownerScope, isKeyOf) }