fix(type): infer parent as this on nextTick function (#3608)

fix #3599
This commit is contained in:
Carlos Rodrigues 2021-07-15 21:28:20 +01:00 committed by GitHub
parent 08f504c1b7
commit 18911abb91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 4 deletions

View File

@ -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<SchedulerJob | SchedulerCb, number>
export function nextTick(
this: ComponentPublicInstance | void,
fn?: () => void
export function nextTick<T = void>(
this: T,
fn?: (this: T) => void
): Promise<void> {
const p = currentFlushPromise || resolvedPromise
return fn ? p.then(this ? fn.bind(this) : fn) : p

View File

@ -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))
})
}
})