--- /dev/null
+import { nextTick } from 'vue'
+import { describe, expectType } from './utils'
+
+describe('nextTick', async () => {
+ expectType<Promise<void>>(nextTick())
+ expectType<Promise<string>>(nextTick(() => 'foo'))
+ expectType<Promise<string>>(nextTick(() => Promise.resolve('foo')))
+ expectType<Promise<string>>(
+ nextTick(() => Promise.resolve(Promise.resolve('foo'))),
+ )
+
+ expectType<void>(await nextTick())
+ expectType<string>(await nextTick(() => 'foo'))
+ expectType<string>(await nextTick(() => Promise.resolve('foo')))
+ expectType<string>(
+ await nextTick(() => Promise.resolve(Promise.resolve('foo'))),
+ )
+
+ nextTick().then(value => {
+ expectType<void>(value)
+ })
+ nextTick(() => 'foo').then(value => {
+ expectType<string>(value)
+ })
+ nextTick(() => Promise.resolve('foo')).then(value => {
+ expectType<string>(value)
+ })
+ nextTick(() => Promise.resolve(Promise.resolve('foo'))).then(value => {
+ expectType<string>(value)
+ })
+})
const RECURSION_LIMIT = 100
type CountMap = Map<SchedulerJob, number>
-export function nextTick<T = void, R = void>(
+export function nextTick(): Promise<void>
+export function nextTick<T, R>(
this: T,
- fn?: (this: T) => R,
-): Promise<Awaited<R>> {
+ fn: (this: T) => R | Promise<R>,
+): Promise<R>
+export function nextTick<T, R>(
+ this: T,
+ fn?: (this: T) => R | Promise<R>,
+): Promise<void | R> {
const p = currentFlushPromise || resolvedPromise
return fn ? p.then(this ? fn.bind(this) : fn) : p
}