+return { props }
+}
+
+})"
+`;
+
+exports[`SFC compile <script setup> with TypeScript withDefaults (static) w/ production mode 1`] = `
+"import { defineComponent as _defineComponent } from 'vue'
+
+export default /*#__PURE__*/_defineComponent({
+ props: {
+ foo: null,
+ bar: { type: Boolean },
+ baz: { type: [Boolean, Function], default: true },
+ qux: { default: 'hi' }
+ },
+ setup(__props: any, { expose }) {
+ expose();
+
+const props = __props as { foo: () => void, bar: boolean, baz: boolean | (() => void), qux: string | number };
+
+
+
return { props }
}
})
})
+ // #7111
+ test('withDefaults (static) w/ production mode', () => {
+ const { content } = compile(
+ `
+ <script setup lang="ts">
+ const props = withDefaults(defineProps<{
+ foo: () => void
+ bar: boolean
+ baz: boolean | (() => void)
+ qux: string | number
+ }>(), {
+ baz: true,
+ qux: 'hi'
+ })
+ </script>
+ `,
+ { isProd: true }
+ )
+ assertCode(content)
+ expect(content).toMatch(`const props = __props`)
+
+ // foo has no default value, the Function can be dropped
+ expect(content).toMatch(`foo: null`)
+ expect(content).toMatch(`bar: { type: Boolean }`)
+ expect(content).toMatch(
+ `baz: { type: [Boolean, Function], default: true }`
+ )
+ expect(content).toMatch(`qux: { default: 'hi' }`)
+ })
+
test('withDefaults (dynamic)', () => {
const { content } = compile(`
<script setup lang="ts">
)}, required: ${required}${
defaultString ? `, ${defaultString}` : ``
} }`
- } else if (type.some(el => el === 'Boolean' || el === 'Function')) {
- // #4783, #7111 for boolean or function, should keep the type
+ } else if (
+ type.some(
+ el =>
+ el === 'Boolean' ||
+ ((!hasStaticDefaults || defaultString) && el === 'Function')
+ )
+ ) {
+ // #4783 for boolean, should keep the type
+ // #7111 for function, if default value exists or it's not static, should keep it
// in production
return `${key}: { type: ${toRuntimeTypeString(type)}${
defaultString ? `, ${defaultString}` : ``