]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-sfc): handle more TS built-in utilities in defineProps inference
authorEvan You <yyx990803@gmail.com>
Tue, 28 Mar 2023 07:40:25 +0000 (15:40 +0800)
committerEvan You <yyx990803@gmail.com>
Tue, 28 Mar 2023 07:41:24 +0000 (15:41 +0800)
packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap
packages/compiler-sfc/__tests__/__snapshots__/compileScriptHoistStatic.spec.ts.snap
packages/compiler-sfc/__tests__/compileScript.spec.ts
packages/compiler-sfc/src/compileScript.ts

index 9018df65a1822c83cbbfe09664c810b54cde4d0c..2b10b20a2d68eb9eb9979ee59a4378a8c4f9078f 100644 (file)
@@ -1637,6 +1637,9 @@ export default /*#__PURE__*/_defineComponent({
     symbol: { type: Symbol, required: true },
     extract: { type: Number, required: true },
     exclude: { type: [Number, Boolean], required: true },
+    uppercase: { type: String, required: true },
+    params: { type: Array, required: true },
+    nonNull: { type: String, required: true },
     objectOrFn: { type: [Function, Object], required: true },
     union: { type: [String, Number], required: true },
     literalUnion: { type: String, required: true },
index 5b7aa43888c95c6b60564be03d4b1bc100790c74..ed5301432e82aa629fdb314c9808101ba2abae9a 100644 (file)
@@ -1,4 +1,4 @@
-// Vitest Snapshot v1
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
 
 exports[`sfc hoist static > should enable when only script setup 1`] = `
 "const foo = 'bar'
index 10eeea0167435557704707f54726454731d68044..6b5ea437519e8b35686e2805dfbe25cc5734ccf6 100644 (file)
@@ -962,6 +962,9 @@ const emit = defineEmits(['a', 'b'])
         symbol: symbol
         extract: Extract<1 | 2 | boolean, 2>
         exclude: Exclude<1 | 2 | boolean, 2>
+        uppercase: Uppercase<'foo'>
+        params: Parameters<(foo: any) => void>
+        nonNull: NonNullable<string | null>
         objectOrFn: {
           (): void
           foo: string
@@ -1004,6 +1007,9 @@ const emit = defineEmits(['a', 'b'])
       expect(content).toMatch(
         `exclude: { type: [Number, Boolean], required: true }`
       )
+      expect(content).toMatch(`uppercase: { type: String, required: true }`)
+      expect(content).toMatch(`params: { type: Array, required: true }`)
+      expect(content).toMatch(`nonNull: { type: String, required: true }`)
       expect(content).toMatch(
         `union: { type: [String, Number], required: true }`
       )
@@ -1047,7 +1053,10 @@ const emit = defineEmits(['a', 'b'])
         literalUnionMixed: BindingTypes.PROPS,
         intersection: BindingTypes.PROPS,
         intersection2: BindingTypes.PROPS,
-        foo: BindingTypes.PROPS
+        foo: BindingTypes.PROPS,
+        uppercase: BindingTypes.PROPS,
+        params: BindingTypes.PROPS,
+        nonNull: BindingTypes.PROPS
       })
     })
 
index 922351d9d45a4bbad33550a9c5eb5428d8f31292..ebaf1eee472b323cd60ae1ac26b535e8b9896885 100644 (file)
@@ -2056,15 +2056,35 @@ function inferRuntimeType(
           case 'Date':
           case 'Promise':
             return [node.typeName.name]
-          case 'Record':
+
+          // TS built-in utility types
+          // https://www.typescriptlang.org/docs/handbook/utility-types.html
           case 'Partial':
+          case 'Required':
           case 'Readonly':
+          case 'Record':
           case 'Pick':
           case 'Omit':
-          case 'Required':
           case 'InstanceType':
             return ['Object']
 
+          case 'Uppercase':
+          case 'Lowercase':
+          case 'Capitalize':
+          case 'Uncapitalize':
+            return ['String']
+
+          case 'Parameters':
+          case 'ConstructorParameters':
+            return ['Array']
+
+          case 'NonNullable':
+            if (node.typeParameters && node.typeParameters.params[0]) {
+              return inferRuntimeType(
+                node.typeParameters.params[0],
+                declaredTypes
+              ).filter(t => t !== 'null')
+            }
           case 'Extract':
             if (node.typeParameters && node.typeParameters.params[1]) {
               return inferRuntimeType(
@@ -2072,15 +2092,15 @@ function inferRuntimeType(
                 declaredTypes
               )
             }
-            return ['null']
           case 'Exclude':
+          case 'OmitThisParameter':
             if (node.typeParameters && node.typeParameters.params[0]) {
               return inferRuntimeType(
                 node.typeParameters.params[0],
                 declaredTypes
               )
             }
-            return ['null']
+          // cannot infer, fallback to null: ThisParameterType
         }
       }
       return [`null`]