]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-sfc): infer function prop type from type literal w/ callable signature...
author三咲智子 Kevin Deng <sxzz@sxzz.moe>
Tue, 28 Mar 2023 03:59:21 +0000 (11:59 +0800)
committerGitHub <noreply@github.com>
Tue, 28 Mar 2023 03:59:21 +0000 (11:59 +0800)
packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap
packages/compiler-sfc/__tests__/compileScript.spec.ts
packages/compiler-sfc/src/compileScript.ts

index 4615b20fe738d86345a432e34a6fef7643ba8a3f..473ebd4e0b947a08f697c20b8cb9e776e5b17cf2 100644 (file)
@@ -1619,6 +1619,7 @@ export default /*#__PURE__*/_defineComponent({
     alias: { type: Array, required: true },
     method: { type: Function, required: true },
     symbol: { type: Symbol, required: true },
+    objectOrFn: { type: [Function, Object], required: true },
     union: { type: [String, Number], required: true },
     literalUnion: { type: String, required: true },
     literalUnionNumber: { type: Number, required: true },
index 27c3e26c423934f16b3928656ff2de2bc96f2b5f..7616c58f27be0e5bb9e0af57bb28db19226e18ee 100644 (file)
@@ -960,6 +960,10 @@ const emit = defineEmits(['a', 'b'])
         alias: Alias
         method(): void
         symbol: symbol
+        objectOrFn: {
+          (): void
+          foo: string
+        }
 
         union: string | number
         literalUnion: 'foo' | 'bar'
@@ -990,6 +994,9 @@ const emit = defineEmits(['a', 'b'])
       expect(content).toMatch(`alias: { type: Array, required: true }`)
       expect(content).toMatch(`method: { type: Function, required: true }`)
       expect(content).toMatch(`symbol: { type: Symbol, required: true }`)
+      expect(content).toMatch(
+        `objectOrFn: { type: [Function, Object], required: true },`
+      )
       expect(content).toMatch(
         `union: { type: [String, Number], required: true }`
       )
@@ -1023,6 +1030,7 @@ const emit = defineEmits(['a', 'b'])
         alias: BindingTypes.PROPS,
         method: BindingTypes.PROPS,
         symbol: BindingTypes.PROPS,
+        objectOrFn: BindingTypes.PROPS,
         union: BindingTypes.PROPS,
         literalUnion: BindingTypes.PROPS,
         literalUnionNumber: BindingTypes.PROPS,
index 9722174f2901454deab7b5979b21c84be57bc560..3cca3c2f43673b37bb4dc4a515595510f22e3166 100644 (file)
@@ -2001,9 +2001,21 @@ function inferRuntimeType(
       return ['Boolean']
     case 'TSObjectKeyword':
       return ['Object']
-    case 'TSTypeLiteral':
+    case 'TSTypeLiteral': {
       // TODO (nice to have) generate runtime property validation
-      return ['Object']
+      const types = new Set<string>()
+      for (const m of node.members) {
+        switch (m.type) {
+          case 'TSCallSignatureDeclaration':
+          case 'TSConstructSignatureDeclaration':
+            types.add('Function')
+            break
+          default:
+            types.add('Object')
+        }
+      }
+      return Array.from(types)
+    }
     case 'TSFunctionType':
       return ['Function']
     case 'TSArrayType':