chore(types): improve type safety in watch functions and instanceWatch (#13918)

This commit is contained in:
Arthur Darkstone 2025-09-24 17:21:41 +08:00 committed by GitHub
parent 5e1e791880
commit fda47ac702
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 9 deletions

View File

@ -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,
@ -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' },
)
}
@ -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' },
)
}
@ -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)) {
@ -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
}

View File

@ -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__) {