}
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]>>
+ [K in keyof T]: ToRef<T[K]>
}
export function toRefs<T extends object>(object: T): ToRefs<T> {
if (__DEV__ && !isProxy(object)) {
toRef,
toRefs,
ToRefs,
- shallowReactive,
- watch
+ shallowReactive
} from './index'
function plainType(arg: number | Ref<number>) {
expectType<number>(p2.a)
expectType<Ref<string>>(p2.obj.k)
-// toRef
-const obj = {
- a: 1,
- b: ref(1)
-}
-expectType<Ref<number>>(toRef(obj, 'a'))
-expectType<Ref<number>>(toRef(obj, 'b'))
+// toRef and toRefs
+{
+ const obj: {
+ a: number
+ b: Ref<number>
+ c: number | string
+ } = {
+ a: 1,
+ b: ref(1),
+ c: 1
+ }
-const objWithUnionProp: { a: string | number } = {
- a: 1
-}
+ // toRef
+ expectType<Ref<number>>(toRef(obj, 'a'))
+ expectType<Ref<number>>(toRef(obj, 'b'))
+ // Should not distribute Refs over union
+ expectType<Ref<number | string>>(toRef(obj, 'c'))
+
+ // toRefs
+ expectType<{
+ a: Ref<number>
+ b: Ref<number>
+ // Should not distribute Refs over union
+ c: Ref<number | string>
+ }>(toRefs(obj))
+
+ // Both should not do any unwrapping
+ const someReactive = shallowReactive({
+ a: {
+ b: ref(42)
+ }
+ })
-watch(toRef(objWithUnionProp, 'a'), value => {
- expectType<string | number>(value)
-})
+ const toRefResult = toRef(someReactive, 'a')
+ const toRefsResult = toRefs(someReactive)
-// toRefs
-const objRefs = toRefs(obj)
-expectType<{
- a: Ref<number>
- b: Ref<number>
-}>(objRefs)
+ expectType<Ref<number>>(toRefResult.value.b)
+ expectType<Ref<number>>(toRefsResult.a.value.b)
+}
// #2687
interface AppData {
testUnrefGenerics(1)
-// #4732
-describe('ref in shallow reactive', () => {
- const baz = shallowReactive({
- foo: {
- bar: ref(42)
- }
- })
-
- const foo = toRef(baz, 'foo')
-
- expectType<Ref<number>>(foo.value.bar)
- expectType<number>(foo.value.bar.value)
-})
-
// #4771
describe('shallow reactive in reactive', () => {
const baz = reactive({