diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index 1d913673123..1e4c83c96d8 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/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 any)>( + source: T, + cb: T extends (...args: any) => infer R + ? (...args: [R, R]) => any + : (...args: any) => any, options?: WatchOptions ): WatchStopHandle } & P & diff --git a/test-dts/watch.test-d.ts b/test-dts/watch.test-d.ts index 52d26c93c4c..2c16cabd9a4 100644 --- a/test-dts/watch.test-d.ts +++ b/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(v) + expectType(ov) + } + ) + } +})