diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap index 5b11ae5c1a5..31378a26535 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap @@ -84,7 +84,8 @@ export default /*#__PURE__*/_defineComponent({ bar: { default: () => {} }, baz: null, boola: { type: Boolean }, - boolb: { type: [Boolean, Number] } + boolb: { type: [Boolean, Number] }, + func: { type: Function, default: () => () => {} } }, setup(__props: any) { diff --git a/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts b/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts index 5d406608288..b71495d726c 100644 --- a/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts @@ -83,7 +83,7 @@ describe('sfc props transform', () => { const { content } = compile( ` `, { isProd: true } @@ -95,7 +95,8 @@ describe('sfc props transform', () => { bar: { default: () => {} }, baz: null, boola: { type: Boolean }, - boolb: { type: [Boolean, Number] } + boolb: { type: [Boolean, Number] }, + func: { type: Function, default: () => () => {} } }`) assertCode(content) }) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index dcaf3848caa..fe1ae0ff0e8 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -692,11 +692,13 @@ export function compileScript( )}, required: ${required}${ defaultString ? `, ${defaultString}` : `` } }` - } else if (type.indexOf('Boolean') > -1) { - // production: if boolean exists, should keep the type. - return `${key}: { type: ${toRuntimeTypeString( - type - )}${ + } else if ( + type.some( + el => el === 'Boolean' || (defaultString && el === 'Function') + ) + ) { + // #4783 production: if boolean or defaultString and function exists, should keep the type. + return `${key}: { type: ${toRuntimeTypeString(type)}${ defaultString ? `, ${defaultString}` : `` } }` } else { @@ -1631,10 +1633,7 @@ function extractRuntimeProps( if (m.type === 'TSMethodSignature') { type = ['Function'] } else if (m.typeAnnotation) { - type = inferRuntimeType( - m.typeAnnotation.typeAnnotation, - declaredTypes - ) + type = inferRuntimeType(m.typeAnnotation.typeAnnotation, declaredTypes) } props[m.key.name] = { key: m.key.name,