diff --git a/packages/runtime-core/__tests__/component.spec.ts b/packages/runtime-core/__tests__/component.spec.ts index bf9377e1b99..dad6f8ca8bb 100644 --- a/packages/runtime-core/__tests__/component.spec.ts +++ b/packages/runtime-core/__tests__/component.spec.ts @@ -14,7 +14,34 @@ describe('renderer: component', () => { test.todo('componentProxy') - test.todo('componentProps') + describe('componentProps', () => { + test.todo('should work') + + test('should convert empty booleans to true', () => { + let b1: any, b2: any, b3: any + + const Comp = defineComponent({ + props: { + b1: Boolean, + b2: [Boolean, String], + b3: [String, Boolean] + }, + setup(props) { + ;({ b1, b2, b3 } = props) + return () => '' + } + }) + + render( + h(Comp, { b1: '', b2: '', b3: '' }), + nodeOps.createElement('div') + ) + + expect(b1).toBe(true) + expect(b2).toBe(true) + expect(b3).toBe('') + }) + }) describe('slots', () => { test('should respect $stable flag', async () => { diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 61b8122e8cf..67ba81b9b01 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -260,7 +260,8 @@ function normalizePropsOptions( const booleanIndex = getTypeIndex(Boolean, prop.type) const stringIndex = getTypeIndex(String, prop.type) prop[BooleanFlags.shouldCast] = booleanIndex > -1 - prop[BooleanFlags.shouldCastTrue] = booleanIndex < stringIndex + prop[BooleanFlags.shouldCastTrue] = + stringIndex < 0 || booleanIndex < stringIndex // if the prop needs boolean casting or default value if (booleanIndex > -1 || hasOwn(prop, 'default')) { needCastKeys.push(normalizedKey) @@ -297,7 +298,7 @@ function getTypeIndex( return i } } - } else if (isObject(expectedTypes)) { + } else if (isFunction(expectedTypes)) { return isSameType(expectedTypes, type) ? 0 : -1 } return -1