Просмотр исходного кода

fix(compiler-sfc): no params were generated when using withDefaults (#12823)

fix #12822
inottn 2 месяцев назад
Родитель
Сommit
b0a1f0504a

+ 1 - 0
packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap

@@ -517,6 +517,7 @@ export default /*@__PURE__*/_defineComponent({
     qux: { type: Function, required: false, default() { return 1 } },
     quux: { type: Function, required: false, default() { } },
     quuxx: { type: Promise, required: false, async default() { return await Promise.resolve('hi') } },
+    quuux: { type: Number, required: false, default(a, [b, ...c], {d, ...e}, ...f) { return 1 } },
     fred: { type: String, required: false, get default() { return 'fred' } }
   },
   setup(__props: any, { expose: __expose }) {

+ 6 - 0
packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts

@@ -387,12 +387,14 @@ const props = defineProps({ foo: String })
       qux?(): number;
       quux?(): void
       quuxx?: Promise<string>;
+      quuux?: number;
       fred?: string
     }>(), {
       foo: 'hi',
       qux() { return 1 },
       ['quux']() { },
       async quuxx() { return await Promise.resolve('hi') },
+      quuux(a, [b, ...c], {d, ...e}, ...f) { return 1 },
       get fred() { return 'fred' }
     })
     </script>
@@ -412,6 +414,9 @@ const props = defineProps({ foo: String })
     expect(content).toMatch(
       `quuxx: { type: Promise, required: false, async default() { return await Promise.resolve('hi') } }`,
     )
+    expect(content).toMatch(
+      `quuux: { type: Number, required: false, default(a, [b, ...c], {d, ...e}, ...f) { return 1 } }`,
+    )
     expect(content).toMatch(
       `fred: { type: String, required: false, get default() { return 'fred' } }`,
     )
@@ -423,6 +428,7 @@ const props = defineProps({ foo: String })
       qux: BindingTypes.PROPS,
       quux: BindingTypes.PROPS,
       quuxx: BindingTypes.PROPS,
+      quuux: BindingTypes.PROPS,
       fred: BindingTypes.PROPS,
       props: BindingTypes.SETUP_CONST,
     })

+ 7 - 1
packages/compiler-sfc/src/script/defineProps.ts

@@ -260,9 +260,15 @@ function genRuntimePropFromType(
         // prop has corresponding static default value
         defaultString = `default: ${ctx.getString(prop.value)}`
       } else {
+        let paramsString = ''
+        if (prop.params.length) {
+          const start = prop.params[0].start
+          const end = prop.params[prop.params.length - 1].end
+          paramsString = ctx.getString({ start, end } as Node)
+        }
         defaultString = `${prop.async ? 'async ' : ''}${
           prop.kind !== 'method' ? `${prop.kind} ` : ''
-        }default() ${ctx.getString(prop.body)}`
+        }default(${paramsString}) ${ctx.getString(prop.body)}`
       }
     }
   }