Explorar el Código

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

fix #3599
Carlos Rodrigues hace 4 años
padre
commit
18911abb91
Se han modificado 2 ficheros con 22 adiciones y 4 borrados
  1. 3 4
      packages/runtime-core/src/scheduler.ts
  2. 19 0
      test-dts/defineComponent.test-d.tsx

+ 3 - 4
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<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

+ 19 - 0
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))
+      })
     }
   })