diff --git a/packages/runtime-core/src/scheduler.ts b/packages/runtime-core/src/scheduler.ts index adaf3c26e84..2dcb84973e8 100644 --- a/packages/runtime-core/src/scheduler.ts +++ b/packages/runtime-core/src/scheduler.ts @@ -1,6 +1,5 @@ import { ErrorCodes, callWithErrorHandling } from './errorHandling' import { isArray } from '@vue/shared' -import { ComponentPublicInstance } from './componentPublicInstance' import { ComponentInternalInstance, getComponentName } from './component' import { warn } from './warning' import { ReactiveEffect } from '@vue/reactivity' @@ -39,9 +38,9 @@ let currentPreFlushParentJob: SchedulerJob | null = null const RECURSION_LIMIT = 100 type CountMap = Map -export function nextTick( - this: ComponentPublicInstance | void, - fn?: () => void +export function nextTick( + this: T, + fn?: (this: T) => void ): Promise { const p = currentFlushPromise || resolvedPromise return fn ? p.then(this ? fn.bind(this) : fn) : p diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index d4c0b94c30e..3f59bd6ad39 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -905,6 +905,25 @@ describe('emits', () => { expectError(this.$emit('input')) // @ts-expect-error expectError(this.$emit('input', 1)) + }, + mounted() { + // #3599 + this.$nextTick(function() { + // this should be bound to this instance + + this.$emit('click', 1) + this.$emit('input', 'foo') + // @ts-expect-error + expectError(this.$emit('nope')) + // @ts-expect-error + expectError(this.$emit('click')) + // @ts-expect-error + expectError(this.$emit('click', 'foo')) + // @ts-expect-error + expectError(this.$emit('input')) + // @ts-expect-error + expectError(this.$emit('input', 1)) + }) } })