From 3bcfdcd1bcfe0219c7c0b9e8a0fa3bed64155fb4 Mon Sep 17 00:00:00 2001 From: caozhong1996 <836934184@qq.com> Date: Tue, 5 Oct 2021 00:00:17 +0800 Subject: [PATCH 1/2] fix(types): make `toRef` return correct type(fix #4732) --- packages/reactivity/__tests__/ref.spec.ts | 10 ++++++++++ packages/reactivity/src/ref.ts | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) 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 From 600a8034b91749a259f5af4da9e52ae9cc9df906 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 8 Oct 2021 11:53:19 -0400 Subject: [PATCH 2/2] chore: use correct test --- packages/reactivity/__tests__/ref.spec.ts | 10 ---------- packages/reactivity/src/ref.ts | 4 +++- test-dts/ref.test-d.ts | 13 +++++++++++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index b7542356804..b416c37ac02 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -268,16 +268,6 @@ 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 968d4e50a8a..f33375824fe 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -65,7 +65,9 @@ export function isRef(r: any): r is Ref { return Boolean(r && r.__v_isRef === true) } -export function ref(value: T): [T] extends [Ref] ? T : Ref> +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) { diff --git a/test-dts/ref.test-d.ts b/test-dts/ref.test-d.ts index c7f1283720e..8129d6182e9 100644 --- a/test-dts/ref.test-d.ts +++ b/test-dts/ref.test-d.ts @@ -10,6 +10,7 @@ import { toRef, toRefs, ToRefs, + shallowReactive, watch } from './index' @@ -236,3 +237,15 @@ function testUnrefGenerics(p: T | Ref) { } testUnrefGenerics(1) + +// #4732 +const baz = shallowReactive({ + foo: { + bar: ref(42) + } +}) + +const foo = toRef(baz, 'foo') + +expectType>(foo.value.bar) +expectType(foo.value.bar.value)