}
export type ToRef<T> = T extends Ref ? T : Ref<UnwrapRef<T>>
-export type ToRefs<T = any> = { [K in keyof T]: ToRef<T[K]> }
+export type ToRefs<T = any> = {
+ // #2687: somehow using ToRef<T[K]> here turns the resulting type into
+ // a union of multiple Ref<*> types instead of a single Ref<* | *> type.
+ [K in keyof T]: T[K] extends Ref ? T[K] : Ref<UnwrapRef<T[K]>>
+}
const convert = <T extends unknown>(val: T): T =>
isObject(val) ? reactive(val) : val
expectType,
proxyRefs,
toRef,
- toRefs
+ toRefs,
+ ToRefs
} from './index'
function plainType(arg: number | Ref<number>) {
const nestedRef = ref({
foo: ref(1)
})
- expectType<Ref<{ foo: number }>>(nestedRef)
expectType<{ foo: number }>(nestedRef.value)
// ref boolean
a: Ref<number>
b: Ref<number>
}>(objRefs)
+
+// #2687
+interface AppData {
+ state: 'state1' | 'state2' | 'state3'
+}
+
+const data: ToRefs<AppData> = toRefs(
+ reactive({
+ state: 'state1'
+ })
+)
+
+switch (data.state.value) {
+ case 'state1':
+ data.state.value = 'state2'
+ break
+ case 'state2':
+ data.state.value = 'state3'
+ break
+ case 'state3':
+ data.state.value = 'state1'
+ break
+}