diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index f0f69af34f6..a086704762a 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -111,7 +111,29 @@ 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 + > = ComponentOptionsWithoutProps< + Props, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > >( options: Options & ComponentOptionsWithoutProps< @@ -154,7 +176,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 +242,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