From fda47ac7024b2065c3a1565a05d514a7a163c9e1 Mon Sep 17 00:00:00 2001 From: Arthur Darkstone Date: Wed, 24 Sep 2025 17:21:41 +0800 Subject: [PATCH] chore(types): improve type safety in watch functions and instanceWatch (#13918) --- packages/runtime-core/src/apiWatch.ts | 24 ++++++++++++------- packages/runtime-core/src/componentOptions.ts | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index 8f6168cdf..4540ba1b0 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -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 } diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index 25d21477c..3b2ad87c8 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -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__) { -- 2.47.3