diff --git a/packages-private/dts-test/defineComponent.test-d.tsx b/packages-private/dts-test/defineComponent.test-d.tsx
index 6188b102b31..12da320c244 100644
--- a/packages-private/dts-test/defineComponent.test-d.tsx
+++ b/packages-private/dts-test/defineComponent.test-d.tsx
@@ -1175,6 +1175,18 @@ describe('componentOptions setup should be `SetupContext`', () => {
)
})
+describe('infer emits from SetupContext', () => {
+ // options
+ const Foo = defineComponent({
+ setup(_, _ctx: SetupContext<['foo']>) {},
+ })
+ ; {}}>
+
+ // functional
+ const Bar = defineComponent((_, _ctx: SetupContext<['foo']>) => () => {})
+ ; {}}>
+})
+
describe('extract instance type', () => {
const Base = defineComponent({
props: {
diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts
index c46741bee80..7c9a6ab661b 100644
--- a/packages/runtime-core/src/component.ts
+++ b/packages/runtime-core/src/component.ts
@@ -284,20 +284,14 @@ export type { ComponentOptions }
export type LifecycleHook = (TFn & SchedulerJob)[] | null
-// use `E extends any` to force evaluating type to fix #2362
-export type SetupContext<
- E = EmitsOptions,
- S extends SlotsType = {},
-> = E extends any
- ? {
- attrs: Attrs
- slots: UnwrapSlotsType
- emit: EmitFn
- expose: = Record>(
- exposed?: Exposed,
- ) => void
- }
- : never
+export type SetupContext = {
+ attrs: Attrs
+ slots: UnwrapSlotsType
+ emit: EmitFn
+ expose: = Record>(
+ exposed?: Exposed,
+ ) => void
+}
/**
* @internal