refactor(runtime-core): refactor watch typing (#2191)

This commit is contained in:
Pick 2020-10-14 03:45:17 +08:00 committed by GitHub
parent 408a8cad48
commit e4a5387435
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -44,13 +44,7 @@ export type WatchCallback<V = any, OV = any> = (
onInvalidate: InvalidateCbRegistrator
) => any
type MapSources<T> = {
[K in keyof T]: T[K] extends WatchSource<infer V>
? V
: T[K] extends object ? T[K] : never
}
type MapOldSources<T, Immediate> = {
type MapSources<T, Immediate> = {
[K in keyof T]: T[K] extends WatchSource<infer V>
? Immediate extends true ? (V | undefined) : V
: T[K] extends object
@ -93,7 +87,7 @@ export function watch<
Immediate extends Readonly<boolean> = false
>(
sources: T,
cb: WatchCallback<MapSources<T>, MapOldSources<T, Immediate>>,
cb: WatchCallback<MapSources<T, false>, MapSources<T, Immediate>>,
options?: WatchOptions<Immediate>
): WatchStopHandle
@ -115,10 +109,10 @@ export function watch<
): WatchStopHandle
// implementation
export function watch<T = any>(
source: WatchSource<T> | WatchSource<T>[],
cb: WatchCallback<T>,
options?: WatchOptions
export function watch<T = any, Immediate extends Readonly<boolean> = false>(
source: T | WatchSource<T>,
cb: any,
options?: WatchOptions<Immediate>
): WatchStopHandle {
if (__DEV__ && !isFunction(cb)) {
warn(
@ -127,11 +121,11 @@ export function watch<T = any>(
`supports \`watch(source, cb, options?) signature.`
)
}
return doWatch(source, cb, options)
return doWatch(source as any, cb, options)
}
function doWatch(
source: WatchSource | WatchSource[] | WatchEffect,
source: WatchSource | WatchSource[] | WatchEffect | object,
cb: WatchCallback | null,
{ immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ,
instance = currentInstance
@ -262,11 +256,11 @@ function doWatch(
}
}
// important: mark the job as a watcher callback so that scheduler knows it
// important: mark the job as a watcher callback so that scheduler knows
// it is allowed to self-trigger (#1727)
job.allowRecurse = !!cb
let scheduler: (job: () => any) => void
let scheduler: ReactiveEffectOptions['scheduler']
if (flush === 'sync') {
scheduler = job
} else if (flush === 'post') {
@ -318,7 +312,7 @@ function doWatch(
export function instanceWatch(
this: ComponentInternalInstance,
source: string | Function,
cb: Function,
cb: WatchCallback,
options?: WatchOptions
): WatchStopHandle {
const publicThis = this.proxy as any