File tree 2 files changed +30
-3
lines changed
2 files changed +30
-3
lines changed Original file line number Diff line number Diff line change @@ -21,7 +21,11 @@ export interface Ref<T = any> {
21
21
}
22
22
23
23
export type ToRef < T > = T extends Ref ? T : Ref < UnwrapRef < T > >
24
- export type ToRefs < T = any > = { [ K in keyof T ] : ToRef < T [ K ] > }
24
+ export type ToRefs < T = any > = {
25
+ // #2687: somehow using ToRef<T[K]> here turns the resulting type into
26
+ // a union of multiple Ref<*> types instead of a single Ref<* | *> type.
27
+ [ K in keyof T ] : T [ K ] extends Ref ? T [ K ] : Ref < UnwrapRef < T [ K ] > >
28
+ }
25
29
26
30
const convert = < T extends unknown > ( val : T ) : T =>
27
31
isObject ( val ) ? reactive ( val ) : val
Original file line number Diff line number Diff line change 8
8
expectType ,
9
9
proxyRefs ,
10
10
toRef ,
11
- toRefs
11
+ toRefs ,
12
+ ToRefs
12
13
} from './index'
13
14
14
15
function plainType ( arg : number | Ref < number > ) {
@@ -28,7 +29,6 @@ function plainType(arg: number | Ref<number>) {
28
29
const nestedRef = ref ( {
29
30
foo : ref ( 1 )
30
31
} )
31
- expectType < Ref < { foo : number } > > ( nestedRef )
32
32
expectType < { foo : number } > ( nestedRef . value )
33
33
34
34
// ref boolean
@@ -171,3 +171,26 @@ expectType<{
171
171
a : Ref < number >
172
172
b : Ref < number >
173
173
} > ( objRefs )
174
+
175
+ // #2687
176
+ interface AppData {
177
+ state : 'state1' | 'state2' | 'state3'
178
+ }
179
+
180
+ const data : ToRefs < AppData > = toRefs (
181
+ reactive ( {
182
+ state : 'state1'
183
+ } )
184
+ )
185
+
186
+ switch ( data . state . value ) {
187
+ case 'state1' :
188
+ data . state . value = 'state2'
189
+ break
190
+ case 'state2' :
191
+ data . state . value = 'state3'
192
+ break
193
+ case 'state3' :
194
+ data . state . value = 'state1'
195
+ break
196
+ }
You can’t perform that action at this time.
0 commit comments