]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-sfc): improve type inference for TSTypeAliasDeclaration with better...
authorlinzhe <40790268+linzhe141@users.noreply.github.com>
Fri, 16 May 2025 00:32:13 +0000 (08:32 +0800)
committerGitHub <noreply@github.com>
Fri, 16 May 2025 00:32:13 +0000 (08:32 +0800)
close #13240

packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap
packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts
packages/compiler-sfc/src/script/resolveType.ts

index fce04c851122f46104e8891b676335896f277233..11367463cd963182542df5491235ae7c6520408e 100644 (file)
@@ -148,6 +148,27 @@ export default /*@__PURE__*/_defineComponent({
 
       
     
+return {  }
+}
+
+})"
+`;
+
+exports[`defineProps > w/ TSTypeAliasDeclaration 1`] = `
+"import { defineComponent as _defineComponent } from 'vue'
+type FunFoo<O> = (item: O) => boolean;
+    type FunBar = FunFoo<number>;
+    
+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 {  }
 }
 
index 836badb51c8ae568fda4db425a01d093a124c455..dcf6341a9fc61bdad093fe85b0d852484fbaa0ea 100644 (file)
@@ -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(`
+    <script setup lang="ts">
+    type FunFoo<O> = (item: O) => boolean;
+    type FunBar = FunFoo<number>;
+    withDefaults(
+      defineProps<{
+        foo?: FunFoo<number>;
+        bar?: FunBar;
+      }>(),
+      {
+        foo: () => true,
+        bar: () => true,
+      },
+    );
+    </script>
+      `)
+    assertCode(content)
+    expect(content).toMatch(
+      `foo: { type: Function, required: false, default: () => true }`,
+    )
+    expect(content).toMatch(
+      `bar: { type: Function, required: false, default: () => true }`,
+    )
+  })
 })
index 6bb647f11ff2ac418827e85ac1e1cdb7ce3b2b59..1f3c4d6837c175a8234209de0a2de6d4174d7ade 100644 (file)
@@ -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)
         }