diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index b416c37ac02..b7542356804 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -268,6 +268,16 @@ describe('reactivity/ref', () => { // should keep ref const r = { x: ref(1) } expect(toRef(r, 'x')).toBe(r.x) + + // #4732 + const baz = { + foo: { + bar: ref(42) + } + } + const foo = toRef(baz, 'foo') + expect(isRef(foo.value.bar)).toBe(true) + expect(foo.value.bar.value).toBe(42) }) test('toRefs', () => { diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index a4a69b1f188..968d4e50a8a 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -65,7 +65,7 @@ export function isRef(r: any): r is Ref { return Boolean(r && r.__v_isRef === true) } -export function ref(value: T): ToRef +export function ref(value: T): [T] extends [Ref] ? T : Ref> export function ref(value: T): Ref> export function ref(): Ref export function ref(value?: unknown) { @@ -212,7 +212,7 @@ class ObjectRefImpl { } } -export type ToRef = [T] extends [Ref] ? T : Ref> +export type ToRef = [T] extends [Ref] ? T : Ref export function toRef( object: T, key: K