]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(types/ref): handle nested refs in UnwrapRef (#12049)
authorTycho <jh.leong@outlook.com>
Fri, 27 Sep 2024 02:23:01 +0000 (10:23 +0800)
committerGitHub <noreply@github.com>
Fri, 27 Sep 2024 02:23:01 +0000 (10:23 +0800)
close #12044

packages-private/dts-test/ref.test-d.ts
packages/reactivity/src/ref.ts

index 929e3d1a1ab3f94fb208e6d804822c90bd50d181..89b80a70fb53e03678619c83c825ef38d0e8e4a8 100644 (file)
@@ -189,6 +189,24 @@ describe('allow getter and setter types to be unrelated', <T>() => {
   f.value = ref(1)
 })
 
+describe('correctly unwraps nested refs', () => {
+  const obj = {
+    n: 24,
+    ref: ref(24),
+    nestedRef: ref({ n: ref(0) }),
+  }
+
+  const a = ref(obj)
+  expectType<number>(a.value.n)
+  expectType<number>(a.value.ref)
+  expectType<number>(a.value.nestedRef.n)
+
+  const b = reactive({ a })
+  expectType<number>(b.a.n)
+  expectType<number>(b.a.ref)
+  expectType<number>(b.a.nestedRef.n)
+})
+
 // computed
 describe('allow computed getter and setter types to be unrelated', () => {
   const obj = ref({
index 1de8b9e3317613d34d9db192bc87f5d7839107ed..43b26b78f9d9fc78f0175f379a1b56e061de1414 100644 (file)
@@ -62,7 +62,9 @@ export function ref(value?: unknown) {
 
 declare const ShallowRefMarker: unique symbol
 
-export type ShallowRef<T = any> = Ref<T> & { [ShallowRefMarker]?: true }
+export type ShallowRef<T = any, S = T> = Ref<T, S> & {
+  [ShallowRefMarker]?: true
+}
 
 /**
  * Shallow version of {@link ref()}.
@@ -490,9 +492,9 @@ export type ShallowUnwrapRef<T> = {
 type DistributeRef<T> = T extends Ref<infer V> ? V : T
 
 export type UnwrapRef<T> =
-  T extends ShallowRef<infer V>
+  T extends ShallowRef<infer V, infer _>
     ? V
-    : T extends Ref<infer V>
+    : T extends Ref<infer V, infer _>
       ? UnwrapRefSimple<V>
       : UnwrapRefSimple<T>