From: Evan You Date: Sun, 26 Mar 2023 07:58:04 +0000 (+0800) Subject: fix(types): ensure defineProps with generics return correct types X-Git-Tag: v3.3.0-alpha.5~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c288c7b0bd6077d690f42153c3fc49a45454a66a;p=thirdparty%2Fvuejs%2Fcore.git fix(types): ensure defineProps with generics return correct types --- diff --git a/packages/dts-test/setupHelpers.test-d.ts b/packages/dts-test/setupHelpers.test-d.ts index 8ad085f9bc..a3ab02cab9 100644 --- a/packages/dts-test/setupHelpers.test-d.ts +++ b/packages/dts-test/setupHelpers.test-d.ts @@ -24,6 +24,16 @@ describe('defineProps w/ type declaration', () => { expectType(props.boolAndUndefined) }) +describe('defineProps w/ generics', () => { + function test() { + const props = defineProps<{ foo: T; bar: string; x?: boolean }>() + expectType(props.foo) + expectType(props.bar) + expectType(props.x) + } + test() +}) + describe('defineProps w/ type declaration + withDefaults', () => { const res = withDefaults( defineProps<{ diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index 882e0389c9..71ac1191a3 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -61,15 +61,7 @@ export function defineProps< PP extends ComponentObjectPropsOptions = ComponentObjectPropsOptions >(props: PP): Prettify>> // overload 3: typed-based declaration -export function defineProps(): Prettify< - Readonly< - Omit> & { - [K in keyof Pick>]-?: NotUndefined< - TypeProps[K] - > - } - > -> +export function defineProps(): ResolveProps // implementation export function defineProps() { if (__DEV__) { @@ -78,6 +70,20 @@ export function defineProps() { return null as any } +type ResolveProps> = Prettify< + Readonly< + T & { + [K in BooleanKeys]-?: boolean + } + > +> + +type BooleanKey = K extends any + ? [T[K]] extends [boolean | undefined] + ? K + : never + : never + /** * Vue `