Skip to content

Commit e2c19c2

Browse files
authored
fix(types/ref): handle nested refs in UnwrapRef (#12049)
close #12044
1 parent ea3efa0 commit e2c19c2

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

Diff for: packages-private/dts-test/ref.test-d.ts

+18
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,24 @@ describe('allow getter and setter types to be unrelated', <T>() => {
189189
f.value = ref(1)
190190
})
191191

192+
describe('correctly unwraps nested refs', () => {
193+
const obj = {
194+
n: 24,
195+
ref: ref(24),
196+
nestedRef: ref({ n: ref(0) }),
197+
}
198+
199+
const a = ref(obj)
200+
expectType<number>(a.value.n)
201+
expectType<number>(a.value.ref)
202+
expectType<number>(a.value.nestedRef.n)
203+
204+
const b = reactive({ a })
205+
expectType<number>(b.a.n)
206+
expectType<number>(b.a.ref)
207+
expectType<number>(b.a.nestedRef.n)
208+
})
209+
192210
// computed
193211
describe('allow computed getter and setter types to be unrelated', () => {
194212
const obj = ref({

Diff for: packages/reactivity/src/ref.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ export function ref(value?: unknown) {
6262

6363
declare const ShallowRefMarker: unique symbol
6464

65-
export type ShallowRef<T = any> = Ref<T> & { [ShallowRefMarker]?: true }
65+
export type ShallowRef<T = any, S = T> = Ref<T, S> & {
66+
[ShallowRefMarker]?: true
67+
}
6668

6769
/**
6870
* Shallow version of {@link ref()}.
@@ -490,9 +492,9 @@ export type ShallowUnwrapRef<T> = {
490492
type DistributeRef<T> = T extends Ref<infer V> ? V : T
491493

492494
export type UnwrapRef<T> =
493-
T extends ShallowRef<infer V>
495+
T extends ShallowRef<infer V, infer _>
494496
? V
495-
: T extends Ref<infer V>
497+
: T extends Ref<infer V, infer _>
496498
? UnwrapRefSimple<V>
497499
: UnwrapRefSimple<T>
498500

0 commit comments

Comments
 (0)