mirror of https://github.com/vuejs/core.git
fix(compiler-sfc): always generate runtime prop type for Function (#7112)
fix #7111
This commit is contained in:
parent
6e8b6b3585
commit
584eae60d1
|
@ -1729,6 +1729,35 @@ const props = __props as {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return { props, get defaults() { return defaults } }
|
||||||
|
}
|
||||||
|
|
||||||
|
})"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`SFC compile <script setup> with TypeScript withDefaults (dynamic) w/ production mode 1`] = `
|
||||||
|
"import { mergeDefaults as _mergeDefaults, defineComponent as _defineComponent } from 'vue'
|
||||||
|
import { defaults } from './foo'
|
||||||
|
|
||||||
|
export default /*#__PURE__*/_defineComponent({
|
||||||
|
props: _mergeDefaults({
|
||||||
|
foo: { type: Function },
|
||||||
|
bar: { type: Boolean },
|
||||||
|
baz: { type: [Boolean, Function] },
|
||||||
|
qux: null
|
||||||
|
}, { ...defaults }),
|
||||||
|
setup(__props: any, { expose }) {
|
||||||
|
expose();
|
||||||
|
|
||||||
|
const props = __props as {
|
||||||
|
foo: () => void
|
||||||
|
bar: boolean
|
||||||
|
baz: boolean | (() => void)
|
||||||
|
qux: string | number
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return { props, get defaults() { return defaults } }
|
return { props, get defaults() { return defaults } }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1144,6 +1144,35 @@ const emit = defineEmits(['a', 'b'])
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #7111
|
||||||
|
test('withDefaults (dynamic) w/ production mode', () => {
|
||||||
|
const { content } = compile(
|
||||||
|
`
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { defaults } from './foo'
|
||||||
|
const props = withDefaults(defineProps<{
|
||||||
|
foo: () => void
|
||||||
|
bar: boolean
|
||||||
|
baz: boolean | (() => void)
|
||||||
|
qux: string | number
|
||||||
|
}>(), { ...defaults })
|
||||||
|
</script>
|
||||||
|
`,
|
||||||
|
{ isProd: true }
|
||||||
|
)
|
||||||
|
assertCode(content)
|
||||||
|
expect(content).toMatch(`import { mergeDefaults as _mergeDefaults`)
|
||||||
|
expect(content).toMatch(
|
||||||
|
`
|
||||||
|
_mergeDefaults({
|
||||||
|
foo: { type: Function },
|
||||||
|
bar: { type: Boolean },
|
||||||
|
baz: { type: [Boolean, Function] },
|
||||||
|
qux: null
|
||||||
|
}, { ...defaults })`.trim()
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
test('defineEmits w/ type', () => {
|
test('defineEmits w/ type', () => {
|
||||||
const { content } = compile(`
|
const { content } = compile(`
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|
|
@ -822,12 +822,9 @@ export function compileScript(
|
||||||
)}, required: ${required}${
|
)}, required: ${required}${
|
||||||
defaultString ? `, ${defaultString}` : ``
|
defaultString ? `, ${defaultString}` : ``
|
||||||
} }`
|
} }`
|
||||||
} else if (
|
} else if (type.some(el => el === 'Boolean' || el === 'Function')) {
|
||||||
type.some(
|
// #4783, #7111 for boolean or function, should keep the type
|
||||||
el => el === 'Boolean' || (defaultString && el === 'Function')
|
// in production
|
||||||
)
|
|
||||||
) {
|
|
||||||
// #4783 production: if boolean or defaultString and function exists, should keep the type.
|
|
||||||
return `${key}: { type: ${toRuntimeTypeString(type)}${
|
return `${key}: { type: ${toRuntimeTypeString(type)}${
|
||||||
defaultString ? `, ${defaultString}` : ``
|
defaultString ? `, ${defaultString}` : ``
|
||||||
} }`
|
} }`
|
||||||
|
|
Loading…
Reference in New Issue