Quellcode durchsuchen

fix(compiler-sfc): add type for props's properties in prod mode (#4790)

fix #4783
ygj6 vor 4 Jahren
Ursprung
Commit
090df0837e

+ 3 - 1
packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap

@@ -82,7 +82,9 @@ export default /*#__PURE__*/_defineComponent({
   props: {
     foo: { default: 1 },
     bar: { default: () => {} },
-    baz: null
+    baz: null,
+    boola: { type: Boolean },
+    boolb: { type: [Boolean, Number] }
   },
   setup(__props: any) {
 

+ 4 - 2
packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts

@@ -83,7 +83,7 @@ describe('sfc props transform', () => {
     const { content } = compile(
       `
       <script setup lang="ts">
-      const { foo = 1, bar = {} } = defineProps<{ foo?: number, bar?: object, baz?: any }>()
+      const { foo = 1, bar = {} } = defineProps<{ foo?: number, bar?: object, baz?: any, boola?: boolean, boolb?: boolean | number }>()
       </script>
     `,
       { isProd: true }
@@ -93,7 +93,9 @@ describe('sfc props transform', () => {
     expect(content).toMatch(`props: {
     foo: { default: 1 },
     bar: { default: () => {} },
-    baz: null
+    baz: null,
+    boola: { type: Boolean },
+    boolb: { type: [Boolean, Number] }
   }`)
     assertCode(content)
   })

+ 15 - 10
packages/compiler-sfc/src/compileScript.ts

@@ -685,13 +685,20 @@ export function compileScript(
           }
         }
 
+        const { type, required } = props[key]
         if (!isProd) {
-          const { type, required } = props[key]
           return `${key}: { type: ${toRuntimeTypeString(
             type
           )}, required: ${required}${
             defaultString ? `, ${defaultString}` : ``
           } }`
+        } else if (type.indexOf('Boolean') > -1) {
+          // production: if boolean exists, should keep the type.
+          return `${key}: { type: ${toRuntimeTypeString(
+            type
+          )}${
+            defaultString ? `, ${defaultString}` : ``
+          } }`
         } else {
           // production: checks are useless
           return `${key}: ${defaultString ? `{ ${defaultString} }` : 'null'}`
@@ -1621,15 +1628,13 @@ function extractRuntimeProps(
       m.key.type === 'Identifier'
     ) {
       let type
-      if (!isProd) {
-        if (m.type === 'TSMethodSignature') {
-          type = ['Function']
-        } else if (m.typeAnnotation) {
-          type = inferRuntimeType(
-            m.typeAnnotation.typeAnnotation,
-            declaredTypes
-          )
-        }
+      if (m.type === 'TSMethodSignature') {
+        type = ['Function']
+      } else if (m.typeAnnotation) {
+        type = inferRuntimeType(
+          m.typeAnnotation.typeAnnotation,
+          declaredTypes
+        )
       }
       props[m.key.name] = {
         key: m.key.name,