Skip to content
24 changes: 16 additions & 8 deletions packages/runtime-core/src/apiWatch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { queuePostRenderEffect } from './renderer'
import { warn } from './warning'
import type { ObjectWatchOptionItem } from './componentOptions'
import { useSSRContext } from './helpers/useSsrContext'
import type { ComponentPublicInstance } from './componentPublicInstance'

export type {
WatchHandle,
Expand Down Expand Up @@ -66,7 +67,9 @@ export function watchPostEffect(
return doWatch(
effect,
null,
__DEV__ ? extend({}, options as any, { flush: 'post' }) : { flush: 'post' },
__DEV__
? extend({}, options as WatchEffectOptions, { flush: 'post' })
: { flush: 'post' },
)
}

Expand All @@ -77,7 +80,9 @@ export function watchSyncEffect(
return doWatch(
effect,
null,
__DEV__ ? extend({}, options as any, { flush: 'sync' }) : { flush: 'sync' },
__DEV__
? extend({}, options as WatchEffectOptions, { flush: 'sync' })
: { flush: 'sync' },
)
}

Expand Down Expand Up @@ -243,11 +248,11 @@ export function instanceWatch(
value: WatchCallback | ObjectWatchOptionItem,
options?: WatchOptions,
): WatchHandle {
const publicThis = this.proxy as any
const publicThis = this.proxy
const getter = isString(source)
? source.includes('.')
? createPathGetter(publicThis, source)
: () => publicThis[source]
? createPathGetter(publicThis!, source)
: () => publicThis![source as keyof typeof publicThis]
: source.bind(publicThis, publicThis)
let cb
if (isFunction(value)) {
Expand All @@ -262,12 +267,15 @@ export function instanceWatch(
return res
}

export function createPathGetter(ctx: any, path: string) {
export function createPathGetter(
ctx: ComponentPublicInstance,
path: string,
): () => WatchSource | WatchSource[] | WatchEffect | object {
const segments = path.split('.')
return (): any => {
return (): WatchSource | WatchSource[] | WatchEffect | object => {
let cur = ctx
for (let i = 0; i < segments.length && cur; i++) {
cur = cur[segments[i]]
cur = cur[segments[i] as keyof typeof cur]
}
return cur
}
Expand Down
2 changes: 1 addition & 1 deletion packages/runtime-core/src/componentOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ export function createWatcher(
): void {
let getter = key.includes('.')
? createPathGetter(publicThis, key)
: () => (publicThis as any)[key]
: () => publicThis[key as keyof typeof publicThis]

const options: WatchOptions = {}
if (__COMPAT__) {
Expand Down
Loading