From d09f791e47bb6cfabf5235b87199b14e5ed74b40 Mon Sep 17 00:00:00 2001 From: daiwei Date: Fri, 4 Oct 2024 20:24:57 +0800 Subject: [PATCH 1/2] fix(types): retain union type narrowing in PropsWithDefaults with defaults applied --- .../dts-test/setupHelpers.test-d.ts | 10 ++++++ packages/runtime-core/src/apiSetupHelpers.ts | 32 ++++++++++--------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/packages-private/dts-test/setupHelpers.test-d.ts b/packages-private/dts-test/setupHelpers.test-d.ts index 4074176ff98..aeab4f9b997 100644 --- a/packages-private/dts-test/setupHelpers.test-d.ts +++ b/packages-private/dts-test/setupHelpers.test-d.ts @@ -58,6 +58,9 @@ describe('defineProps w/ type declaration + withDefaults', (), { number: 123, @@ -88,6 +91,13 @@ describe('defineProps w/ type declaration + withDefaults', (res.bool) expectType(res.boolAndUndefined) + + if (res.u.type === 'button') { + expectType<'submit' | undefined>(res.u.buttonType) + } + if (res.u.type === 'link') { + expectType(res.u.href) + } }) describe('defineProps w/ union type declaration + withDefaults', () => { diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index 33817818a93..54712c6807a 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -331,21 +331,23 @@ type PropsWithDefaults< T, Defaults extends InferDefaults, BKeys extends keyof T, -> = Readonly> & { - readonly [K in keyof Defaults as K extends keyof T - ? K - : never]-?: K extends keyof T - ? Defaults[K] extends undefined - ? IfAny, T[K]> - : NotUndefined - : never -} & { - readonly [K in BKeys]-?: K extends keyof Defaults - ? Defaults[K] extends undefined - ? boolean | undefined - : boolean - : boolean -} +> = T extends unknown + ? Readonly> & { + readonly [K in keyof Defaults as K extends keyof T + ? K + : never]-?: K extends keyof T + ? Defaults[K] extends undefined + ? IfAny, T[K]> + : NotUndefined + : never + } & { + readonly [K in BKeys]-?: K extends keyof Defaults + ? Defaults[K] extends undefined + ? boolean | undefined + : boolean + : boolean + } + : never /** * Vue `