diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index 0ab3d252d55..e5784010f11 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -58,7 +58,19 @@ export function defineProps< PP extends ComponentObjectPropsOptions = ComponentObjectPropsOptions >(props: PP): Readonly> // overload 3: typed-based declaration -export function defineProps(): Readonly +// the Boolean absent props will be cast to false, so the return type +// must be a boolean type +export function defineProps(): Readonly< + { + [K in keyof TypeProps as TypeProps[K] extends boolean | undefined + ? K + : never]-?: NotUndefined + } & { + [K in keyof TypeProps as TypeProps[K] extends boolean | undefined + ? never + : K]: TypeProps[K] + } +> // implementation export function defineProps() { if (__DEV__) { @@ -142,13 +154,27 @@ type InferDefault = T extends ? T | ((props: P) => T) : (props: P) => T -type PropsWithDefaults = Base & { - [K in keyof Defaults]: K extends keyof Base +type PropsWithDefaults = { + [K in keyof Base as K extends keyof Defaults + ? Defaults[K] extends undefined + ? never + : K + : K]: Base[K]; +} & { + [K in keyof Base as K extends keyof Defaults + ? Defaults[K] extends undefined + ? K + : never + : never]?: Base[K] | undefined; +} & Readonly<{ + [K in keyof Defaults as Defaults[K] extends undefined + ? never + : K]: K extends keyof Base ? Defaults[K] extends undefined ? Base[K] : NotUndefined - : never -} + : never; +}> /** * Vue `