mirror of https://github.com/vuejs/core.git
chore(types): improve type safety in watch functions and instanceWatch (#13918)
This commit is contained in:
parent
5e1e791880
commit
fda47ac702
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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__) {
|
||||
|
|
Loading…
Reference in New Issue