]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-sfc): infer TS Extract&Exclude runtime type (#7339)
author三咲智子 Kevin Deng <sxzz@sxzz.moe>
Tue, 28 Mar 2023 07:19:14 +0000 (15:19 +0800)
committerGitHub <noreply@github.com>
Tue, 28 Mar 2023 07:19:14 +0000 (15:19 +0800)
closes #7337
closes #6252

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

index 473ebd4e0b947a08f697c20b8cb9e776e5b17cf2..879790e16fa3594001557b5ef07a7181e0ffd0b6 100644 (file)
@@ -1619,6 +1619,8 @@ export default /*#__PURE__*/_defineComponent({
     alias: { type: Array, required: true },
     method: { type: Function, required: true },
     symbol: { type: Symbol, required: true },
+    extract: { type: Number, required: true },
+    exclude: { type: [Number, Boolean], required: true },
     objectOrFn: { type: [Function, Object], required: true },
     union: { type: [String, Number], required: true },
     literalUnion: { type: String, required: true },
index 7616c58f27be0e5bb9e0af57bb28db19226e18ee..5fb90b475e682d2ca3cada9968979cda07ceadc9 100644 (file)
@@ -960,6 +960,8 @@ const emit = defineEmits(['a', 'b'])
         alias: Alias
         method(): void
         symbol: symbol
+        extract: Extract<1 | 2 | boolean, 2>
+        exclude: Exclude<1 | 2 | boolean, 2>
         objectOrFn: {
           (): void
           foo: string
@@ -997,6 +999,10 @@ const emit = defineEmits(['a', 'b'])
       expect(content).toMatch(
         `objectOrFn: { type: [Function, Object], required: true },`
       )
+      expect(content).toMatch(`extract: { type: Number, required: true }`)
+      expect(content).toMatch(
+        `exclude: { type: [Number, Boolean], required: true }`
+      )
       expect(content).toMatch(
         `union: { type: [String, Number], required: true }`
       )
@@ -1031,6 +1037,8 @@ const emit = defineEmits(['a', 'b'])
         method: BindingTypes.PROPS,
         symbol: BindingTypes.PROPS,
         objectOrFn: BindingTypes.PROPS,
+        extract: BindingTypes.PROPS,
+        exclude: BindingTypes.PROPS,
         union: BindingTypes.PROPS,
         literalUnion: BindingTypes.PROPS,
         literalUnionNumber: BindingTypes.PROPS,
index 3cca3c2f43673b37bb4dc4a515595510f22e3166..278a433db3881ab303d42604cbdf4525ac75d042 100644 (file)
@@ -2057,11 +2057,26 @@ function inferRuntimeType(
           case 'Readonly':
           case 'Pick':
           case 'Omit':
-          case 'Exclude':
-          case 'Extract':
           case 'Required':
           case 'InstanceType':
             return ['Object']
+
+          case 'Extract':
+            if (node.typeParameters && node.typeParameters.params[1]) {
+              return inferRuntimeType(
+                node.typeParameters.params[1],
+                declaredTypes
+              )
+            }
+            return ['null']
+          case 'Exclude':
+            if (node.typeParameters && node.typeParameters.params[0]) {
+              return inferRuntimeType(
+                node.typeParameters.params[0],
+                declaredTypes
+              )
+            }
+            return ['null']
         }
       }
       return [`null`]