diff --git a/packages/dts-test/ref.test-d.ts b/packages/dts-test/ref.test-d.ts index bbcde45ddda..b5104b897f3 100644 --- a/packages/dts-test/ref.test-d.ts +++ b/packages/dts-test/ref.test-d.ts @@ -388,3 +388,24 @@ describe('toRef <-> toValue', () => { ) ) }) + +// #9314 +describe('Ref Unwrapping', () => { + const num = ref(0) + expectType>(num) + + const obj1 = ref({ count: ref(0) }) + const obj2 = reactive({ count: ref(0) }) + expectType(obj1.value.count) + expectType(obj2.count) + + const map1 = ref(new Map([['count', ref(0)]])) + const map2 = reactive(new Map([['count', ref(0)]])) + expectType>(map1.value.get('count')!) + expectType>(map2.get('count')!) + + const map3 = ref(new Map([['count', { foo: ref(0) }]])) + const map4 = reactive(new Map([['count', { foo: ref(0) }]])) + expectType<{ foo: number }>(map3.value.get('count')!) + expectType<{ foo: number }>(map4.get('count')!) +}) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 915f5760878..6ce73b63ba4 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -490,14 +490,25 @@ export type UnwrapRef = T extends ShallowRef ? UnwrapRefSimple : UnwrapRefSimple +type UnwrapRefCollection = T extends Set + ? Set> + : T extends Map + ? Map> + : T extends WeakSet + ? WeakSet> + : T extends WeakMap + ? WeakMap> + : T + export type UnwrapRefSimple = T extends | Function - | CollectionTypes | BaseTypes | Ref | RefUnwrapBailTypes[keyof RefUnwrapBailTypes] | { [RawSymbol]?: true } ? T + : T extends CollectionTypes + ? UnwrapRefCollection : T extends ReadonlyArray ? { [K in keyof T]: UnwrapRefSimple } : T extends object & { [ShallowReactiveMarker]?: never }