diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index 0ee32866da8..3f833fd30de 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -310,6 +310,21 @@ describe('reactivity/ref', () => { expect(isReadonly(x)).toBe(true) }) + test('toRef getter object', () => { + const obj = toRef(() => ({ a: 1 })) + + expect(isRef(obj)).toBe(true) + expect(unref(obj)).toEqual({ a: 1 }) + expect(obj.value.a).toBe(1) + + //@ts-expect-error + obj.value.a = 2 + + expect(obj.value.a).toBe(1) + + expect(isReadonly(obj)).toBe(true) + }) + test('toRefs', () => { const a = reactive({ x: 1, diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index e156a2e1134..4b7e593d4c1 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -14,7 +14,8 @@ import { isReactive, toReactive, isReadonly, - isShallow + isShallow, + type DeepReadonly } from './reactive' import type { ShallowReactiveMarker } from './reactive' import { createDep, Dep } from './dep' @@ -416,7 +417,7 @@ export type ToRef = IfAny, [T] extends [Ref] ? T : Ref> export function toRef( value: T ): T extends () => infer R - ? Readonly> + ? DeepReadonly> : T extends Ref ? T : Ref>