From 6c3b32e61c2bbfe415862b3ce854d9bc77dc5540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Fri, 15 Dec 2023 16:42:37 +0800 Subject: [PATCH 1/4] fix(types): fix `shallowRef` type error --- packages/dts-test/ref.test-d.ts | 8 +++++--- packages/reactivity/src/ref.ts | 10 +++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/dts-test/ref.test-d.ts b/packages/dts-test/ref.test-d.ts index a467c446d0a..5c1701c8d72 100644 --- a/packages/dts-test/ref.test-d.ts +++ b/packages/dts-test/ref.test-d.ts @@ -201,9 +201,11 @@ if (refStatus.value === 'initial') { expectType>(false) } -describe('shallowRef with generic', () => { - const r = ref({}) as MaybeRef - expectType | Ref>(shallowRef(r)) +describe('shallowRef with generic', () => { + const r = ref({}) as unknown as T + const s = shallowRef(r) + expectType(s.value.name) + expectType>(shallowRef(r)) }) // proxyRefs: should return `reactive` directly diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index f068844100e..47f3c182fd2 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -114,9 +114,13 @@ export type ShallowRef = Ref & { [ShallowRefMarker]?: true } * @param value - The "inner value" for the shallow ref. * @see {@link https://vuejs.org/api/reactivity-advanced.html#shallowref} */ -export function shallowRef(value: MaybeRef): Ref | ShallowRef -export function shallowRef(value: T): T -export function shallowRef(value: T): ShallowRef +export function shallowRef( + value: T +): 1 extends (T extends Ref ? 1 : 0) + ? T extends Ref + ? IfAny, T> + : ShallowRef + : ShallowRef export function shallowRef(): ShallowRef export function shallowRef(value?: unknown) { return createRef(value, true) From fdbda1ab1b5c3f7f92af708003fbccf7153454fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Fri, 15 Dec 2023 22:54:22 +0800 Subject: [PATCH 2/4] types(shallowRef): simplified type --- packages/reactivity/src/ref.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 47f3c182fd2..a85c79c0bc6 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -116,7 +116,7 @@ export type ShallowRef = Ref & { [ShallowRefMarker]?: true } */ export function shallowRef( value: T -): 1 extends (T extends Ref ? 1 : 0) +): Ref extends T ? T extends Ref ? IfAny, T> : ShallowRef From bf0cbded0129468e91f004f14eea971e66a366ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Fri, 15 Dec 2023 23:07:48 +0800 Subject: [PATCH 3/4] test(shallowRef): add test case --- packages/dts-test/ref.test-d.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/dts-test/ref.test-d.ts b/packages/dts-test/ref.test-d.ts index 5c1701c8d72..f73f7632af6 100644 --- a/packages/dts-test/ref.test-d.ts +++ b/packages/dts-test/ref.test-d.ts @@ -208,6 +208,16 @@ describe('shallowRef with generic', () => { expectType>(shallowRef(r)) }) +{ + // should return ShallowRef | Ref, not ShallowRef> + expectType | Ref<{ name: string }>>( + shallowRef({} as MaybeRef<{ name: string }>) + ) + expectType | Ref | ShallowRef>( + shallowRef('' as Ref | string | number) + ) +} + // proxyRefs: should return `reactive` directly const r1 = reactive({ k: 'v' From 09d913b803d3f2b2c1a2201f4f31fa975d8372ea Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 16 Dec 2023 13:39:22 +0800 Subject: [PATCH 4/4] Update ref.test-d.ts --- packages/dts-test/ref.test-d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dts-test/ref.test-d.ts b/packages/dts-test/ref.test-d.ts index f73f7632af6..f66ff926907 100644 --- a/packages/dts-test/ref.test-d.ts +++ b/packages/dts-test/ref.test-d.ts @@ -202,7 +202,7 @@ if (refStatus.value === 'initial') { } describe('shallowRef with generic', () => { - const r = ref({}) as unknown as T + const r = {} as T const s = shallowRef(r) expectType(s.value.name) expectType>(shallowRef(r))