From a0a010ddc9ba8ef3e883454c73997bf6fb40b385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Thu, 2 Feb 2023 10:57:28 +0800 Subject: [PATCH] fix(types): optional boolean props should have boolean type in return type of defineProps (#7619) close #7116 fix #5847 fix #7487 --- packages/runtime-core/src/apiSetupHelpers.ts | 15 +++++++++++++-- test-dts/setupHelpers.test-d.ts | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index 0ab3d252d55..6f6097aa809 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -58,7 +58,13 @@ export function defineProps< PP extends ComponentObjectPropsOptions = ComponentObjectPropsOptions >(props: PP): Readonly> // overload 3: typed-based declaration -export function defineProps(): Readonly +export function defineProps(): Readonly< + Omit> & { + [K in keyof Pick>]-?: NotUndefined< + TypeProps[K] + > + } +> // implementation export function defineProps() { if (__DEV__) { @@ -128,6 +134,12 @@ export function defineExpose< type NotUndefined = T extends undefined ? never : T +type BooleanKey = K extends any + ? [T[K]] extends [boolean | undefined] + ? K + : never + : never + type InferDefaults = { [K in keyof T]?: InferDefault> } @@ -149,7 +161,6 @@ type PropsWithDefaults = Base & { : NotUndefined : never } - /** * Vue `