44 type EffectScheduler ,
55 ReactiveEffect ,
66 ReactiveFlags ,
7+ type ReactiveMarker ,
78 type Ref ,
89 getCurrentScope ,
910 isReactive ,
@@ -53,15 +54,13 @@ export type WatchCallback<V = any, OV = any> = (
5354 onCleanup : OnCleanup ,
5455) => any
5556
57+ type MaybeUndefined < T , I > = I extends true ? T | undefined : T
58+
5659type MapSources < T , Immediate > = {
5760 [ K in keyof T ] : T [ K ] extends WatchSource < infer V >
58- ? Immediate extends true
59- ? V | undefined
60- : V
61+ ? MaybeUndefined < V , Immediate >
6162 : T [ K ] extends object
62- ? Immediate extends true
63- ? T [ K ] | undefined
64- : T [ K ]
63+ ? MaybeUndefined < T [ K ] , Immediate >
6564 : never
6665}
6766
@@ -117,28 +116,28 @@ type MultiWatchSources = (WatchSource<unknown> | object)[]
117116// overload: single source + cb
118117export function watch < T , Immediate extends Readonly < boolean > = false > (
119118 source : WatchSource < T > ,
120- cb : WatchCallback < T , Immediate extends true ? T | undefined : T > ,
119+ cb : WatchCallback < T , MaybeUndefined < T , Immediate > > ,
121120 options ?: WatchOptions < Immediate > ,
122121) : WatchStopHandle
123122
124- // overload: array of multiple sources + cb
123+ // overload: reactive array or tuple of multiple sources + cb
125124export function watch <
126- T extends MultiWatchSources ,
125+ T extends Readonly < MultiWatchSources > ,
127126 Immediate extends Readonly < boolean > = false ,
128127> (
129- sources : [ ...T ] ,
130- cb : WatchCallback < MapSources < T , false > , MapSources < T , Immediate > > ,
128+ sources : readonly [ ...T ] | T ,
129+ cb : [ T ] extends [ ReactiveMarker ]
130+ ? WatchCallback < T , MaybeUndefined < T , Immediate > >
131+ : WatchCallback < MapSources < T , false > , MapSources < T , Immediate > > ,
131132 options ?: WatchOptions < Immediate > ,
132133) : WatchStopHandle
133134
134- // overload: multiple sources w/ `as const`
135- // watch([foo, bar] as const, () => {})
136- // somehow [...T] breaks when the type is readonly
135+ // overload: array of multiple sources + cb
137136export function watch <
138- T extends Readonly < MultiWatchSources > ,
137+ T extends MultiWatchSources ,
139138 Immediate extends Readonly < boolean > = false ,
140139> (
141- source : T ,
140+ sources : [ ... T ] ,
142141 cb : WatchCallback < MapSources < T , false > , MapSources < T , Immediate > > ,
143142 options ?: WatchOptions < Immediate > ,
144143) : WatchStopHandle
@@ -149,7 +148,7 @@ export function watch<
149148 Immediate extends Readonly < boolean > = false ,
150149> (
151150 source : T ,
152- cb : WatchCallback < T , Immediate extends true ? T | undefined : T > ,
151+ cb : WatchCallback < T , MaybeUndefined < T , Immediate > > ,
153152 options ?: WatchOptions < Immediate > ,
154153) : WatchStopHandle
155154
0 commit comments