diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index b07ca81d875..165df256ed6 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -47,7 +47,11 @@ type DefaultFactory = (props: Data) => T | null | undefined interface PropOptions { type?: PropType | true | null required?: boolean - default?: D | DefaultFactory | null | undefined + default?: + | D + | DefaultFactory any ? D : T> + | null + | undefined validator?(value: unknown): boolean } diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index 6918db61c8e..d334a3a9a1c 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -30,6 +30,7 @@ describe('with object props', () => { hhh: boolean ggg: 'foo' | 'bar' validated?: string + fnWithDefault: (a: number) => number } type GT = string & { __brand: unknown } @@ -93,6 +94,10 @@ describe('with object props', () => { type: String, // validator requires explicit annotation validator: (val: unknown) => val !== '' + }, + fnWithDefault: { + type: Function as PropType<(a: number) => number>, + default: (a: number) => a * 2 } }, setup(props) { @@ -113,6 +118,7 @@ describe('with object props', () => { expectType(props.hhh) expectType(props.ggg) expectType(props.validated) + expectType(props.fnWithDefault) // @ts-expect-error props should be readonly expectError((props.a = 1))