From 6f1efd73b3b00abd5d990ccd57c20bccce830043 Mon Sep 17 00:00:00 2001 From: Carlos Rodrigues Date: Wed, 18 May 2022 12:52:01 +0100 Subject: [PATCH 1/2] types(defineComponent): fix `defineComponent` inference to `Component` --- .../runtime-core/src/apiDefineComponent.ts | 63 +++++++++++++++++-- test-dts/defineComponent.test-d.tsx | 17 ++++- test-dts/index.d.ts | 3 +- 3 files changed, 77 insertions(+), 6 deletions(-) diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index f0f69af34f6..b950225d047 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -42,7 +42,7 @@ export type DefineComponent< E extends EmitsOptions = {}, EE extends string = string, Provide extends ComponentProvideOptions = ComponentProvideOptions, - RawOptions extends {} = {}, + RawOptions extends Record = {}, PP = PublicProps, Props = Readonly< PropsOrPropOptions extends ComponentPropsOptions @@ -111,7 +111,18 @@ export function defineComponent< E extends EmitsOptions = EmitsOptions, EE extends string = string, Provide extends ComponentProvideOptions = ComponentProvideOptions, - Options extends {} = {} + Options extends ComponentOptionsWithoutProps< + Props, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > = {} >( options: Options & ComponentOptionsWithoutProps< @@ -154,7 +165,29 @@ export function defineComponent< E extends EmitsOptions = Record, EE extends string = string, Provide extends ComponentProvideOptions = ComponentProvideOptions, - Options extends {} = {} + Options extends ComponentOptionsWithArrayProps< + PropNames, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > = ComponentOptionsWithArrayProps< + PropNames, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > >( options: Options & ComponentOptionsWithArrayProps< @@ -198,7 +231,29 @@ export function defineComponent< E extends EmitsOptions = Record, EE extends string = string, Provide extends ComponentProvideOptions = ComponentProvideOptions, - Options extends {} = {} + Options extends ComponentOptionsWithObjectProps< + PropsOptions, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > = ComponentOptionsWithObjectProps< + PropsOptions, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > >( options: Options & ComponentOptionsWithObjectProps< diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index 3c4e9cb3936..7412d6db36f 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -1,5 +1,6 @@ import { describe, + test, Component, defineComponent, PropType, @@ -1045,7 +1046,7 @@ describe('emits', () => { }) describe('componentOptions setup should be `SetupContext`', () => { - expect( + expectType( {} as (props: Record, ctx: SetupContext) => any ) }) @@ -1141,6 +1142,20 @@ describe('async setup', () => { vm.a = 2 }) +// #5948 +describe('DefineComponent should infer correct types when assigning to Component', () => { + let component: Component + component = defineComponent({ + setup(_, { attrs, slots }) { + // @ts-expect-error should not be any + expectType<[]>(attrs) + // @ts-expect-error should not be any + expectType<[]>(slots) + } + }) + expectType(component) +}) + // check if defineComponent can be exported export default { // function components diff --git a/test-dts/index.d.ts b/test-dts/index.d.ts index d0eeb6a7b65..0662a6447e6 100644 --- a/test-dts/index.d.ts +++ b/test-dts/index.d.ts @@ -4,6 +4,7 @@ export * from '@vue/runtime-dom' export function describe(_name: string, _fn: () => void): void +export function test(_name: string, _fn: () => any): void export function expectType(value: T): void export function expectError(value: T): void @@ -15,4 +16,4 @@ export type IsUnion = ( ? false : true -export type IsAny = 0 extends (1 & T) ? true : false +export type IsAny = 0 extends 1 & T ? true : false From 9dd4c49fa7a46f57eac5234eb27ce74f017c0347 Mon Sep 17 00:00:00 2001 From: Carlos Rodrigues Date: Wed, 18 May 2022 13:04:11 +0100 Subject: [PATCH 2/2] chore: remove unintended changes --- packages/runtime-core/src/apiDefineComponent.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index b950225d047..a086704762a 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -42,7 +42,7 @@ export type DefineComponent< E extends EmitsOptions = {}, EE extends string = string, Provide extends ComponentProvideOptions = ComponentProvideOptions, - RawOptions extends Record = {}, + RawOptions extends {} = {}, PP = PublicProps, Props = Readonly< PropsOrPropOptions extends ComponentPropsOptions @@ -122,7 +122,18 @@ export function defineComponent< E, EE, Provide - > = {} + > = ComponentOptionsWithoutProps< + Props, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > >( options: Options & ComponentOptionsWithoutProps<