Explorar o código

fix(types): `$watch` callback parameters type (#6136)

fix #6135
webfansplz %!s(int64=3) %!d(string=hai) anos
pai
achega
41d9c47300

+ 5 - 3
packages/runtime-core/src/componentPublicInstance.ts

@@ -193,9 +193,11 @@ export type ComponentPublicInstance<
   $options: Options & MergedComponentOptionsOverride
   $forceUpdate: () => void
   $nextTick: typeof nextTick
-  $watch(
-    source: string | Function,
-    cb: Function,
+  $watch<T extends string | ((...args: any) => any)>(
+    source: T,
+    cb: T extends (...args: any) => infer R
+      ? (...args: [R, R]) => any
+      : (...args: any) => any,
     options?: WatchOptions
   ): WatchStopHandle
 } & P &

+ 17 - 1
test-dts/watch.test-d.ts

@@ -1,4 +1,4 @@
-import { ref, computed, watch, expectType } from './index'
+import { ref, computed, watch, expectType, defineComponent } from './index'
 
 const source = ref('foo')
 const source2 = computed(() => source.value)
@@ -75,3 +75,19 @@ watch([someRef, otherRef], values => {
   // no type error
   console.log(value2.a)
 })
+
+// #6135
+defineComponent({
+  data() {
+    return { a: 1 }
+  },
+  created() {
+    this.$watch(
+      () => this.a,
+      (v, ov) => {
+        expectType<number>(v)
+        expectType<number>(ov)
+      }
+    )
+  }
+})