From 1c0863f4609476ea82b3e509f68a074ee1c50d57 Mon Sep 17 00:00:00 2001 From: Ray-D-Song Date: Wed, 12 Nov 2025 11:58:06 +0800 Subject: [PATCH] fix: resolve type reference in props annotation --- .../babel-plugin-resolve-type/src/index.ts | 10 ++++++++-- .../__snapshots__/resolve-type.test.tsx.snap | 20 +++++++++++++++++++ .../test/resolve-type.test.tsx | 18 +++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/babel-plugin-resolve-type/src/index.ts b/packages/babel-plugin-resolve-type/src/index.ts index 5ae2294b..76ddeaf7 100644 --- a/packages/babel-plugin-resolve-type/src/index.ts +++ b/packages/babel-plugin-resolve-type/src/index.ts @@ -147,14 +147,20 @@ const plugin: ( if (generics) { ctx!.propsTypeDecl = resolveTypeReference(generics); } else { - ctx!.propsTypeDecl = getTypeAnnotation(props.left); + const typeAnnotation = getTypeAnnotation(props.left); + ctx!.propsTypeDecl = typeAnnotation && t.isTSTypeReference(typeAnnotation) + ? resolveTypeReference(typeAnnotation) || typeAnnotation + : typeAnnotation; } ctx!.propsRuntimeDefaults = props.right; } else { if (generics) { ctx!.propsTypeDecl = resolveTypeReference(generics); } else { - ctx!.propsTypeDecl = getTypeAnnotation(props); + const typeAnnotation = getTypeAnnotation(props); + ctx!.propsTypeDecl = typeAnnotation && t.isTSTypeReference(typeAnnotation) + ? resolveTypeReference(typeAnnotation) || typeAnnotation + : typeAnnotation; } } diff --git a/packages/babel-plugin-resolve-type/test/__snapshots__/resolve-type.test.tsx.snap b/packages/babel-plugin-resolve-type/test/__snapshots__/resolve-type.test.tsx.snap index c8f7a39d..3c40375e 100644 --- a/packages/babel-plugin-resolve-type/test/__snapshots__/resolve-type.test.tsx.snap +++ b/packages/babel-plugin-resolve-type/test/__snapshots__/resolve-type.test.tsx.snap @@ -211,6 +211,26 @@ defineComponent((props = { });" `; +exports[`resolve type > runtime props > with type reference annotation 1`] = ` +"import { defineComponent } from 'vue'; +interface MyProps { + list?: Array<{ + id: number; + title: string; + }>; +} +defineComponent((props: MyProps) => { + return () =>
{props.list?.length}
; +}, { + props: { + list: { + type: Array, + required: false + } + } +});" +`; + exports[`resolve type > w/ tsx 1`] = ` "import { type SetupContext, defineComponent } from 'vue'; defineComponent(() => { diff --git a/packages/babel-plugin-resolve-type/test/resolve-type.test.tsx b/packages/babel-plugin-resolve-type/test/resolve-type.test.tsx index 466d4132..754f61e9 100644 --- a/packages/babel-plugin-resolve-type/test/resolve-type.test.tsx +++ b/packages/babel-plugin-resolve-type/test/resolve-type.test.tsx @@ -87,6 +87,24 @@ describe('resolve type', () => { ); expect(result).toMatchSnapshot(); }); + + test('with type reference annotation', async () => { + const result = await transform( + ` + import { defineComponent } from 'vue'; + interface MyProps { + list?: Array<{ + id: number + title: string + }> + } + defineComponent((props: MyProps) => { + return () =>
{props.list?.length}
; + }) + ` + ); + expect(result).toMatchSnapshot(); + }); }); describe('runtime emits', () => {