From 9909359846bdb93ad67b0181e4f5198aba5b4799 Mon Sep 17 00:00:00 2001 From: Yunfei He Date: Fri, 22 Oct 2021 11:22:08 +0800 Subject: [PATCH] fix(types): should unwrap tuple correctly --- packages/reactivity/src/ref.ts | 13 ++++----- test-dts/reactivity.test-d.ts | 48 +++++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index fb43668e455..6991482df90 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -255,13 +255,10 @@ export interface RefUnwrapBailTypes {} export type ShallowUnwrapRef = { [K in keyof T]: T[K] extends Ref - ? V - : // if `V` is `unknown` that means it does not extend `Ref` and is undefined - T[K] extends Ref | undefined - ? unknown extends V - ? undefined - : V | undefined - : T[K] + ? V // if `V` is `unknown` that means it does not extend `Ref` and is undefined + : T[K] extends Ref | undefined + ? unknown extends V ? undefined : V | undefined + : T[K] } export type UnwrapRef = T extends ShallowRef @@ -277,7 +274,7 @@ export type UnwrapRefSimple = T extends | Ref | RefUnwrapBailTypes[keyof RefUnwrapBailTypes] ? T - : T extends Array + : T extends ReadonlyArray ? { [K in keyof T]: UnwrapRefSimple } : T extends object & { [ShallowReactiveMarker]?: never } ? { diff --git a/test-dts/reactivity.test-d.ts b/test-dts/reactivity.test-d.ts index 3c35ea58a01..ef688796c49 100644 --- a/test-dts/reactivity.test-d.ts +++ b/test-dts/reactivity.test-d.ts @@ -1,15 +1,33 @@ -import { ref, readonly, describe, expectError, expectType, Ref } from './index' - -describe('should support DeepReadonly', () => { - const r = readonly({ obj: { k: 'v' } }) - // @ts-expect-error - expectError((r.obj = {})) - // @ts-expect-error - expectError((r.obj.k = 'x')) -}) - -// #4180 -describe('readonly ref', () => { - const r = readonly(ref({ count: 1 })) - expectType(r) -}) +import { + ref, + readonly, + describe, + expectError, + expectType, + Ref, + reactive +} from './index' + +describe('should support DeepReadonly', () => { + const r = readonly({ obj: { k: 'v' } }) + // @ts-expect-error + expectError((r.obj = {})) + // @ts-expect-error + expectError((r.obj.k = 'x')) +}) + +// #4180 +describe('readonly ref', () => { + const r = readonly(ref({ count: 1 })) + expectType(r) +}) + +describe('should unwrap tuple correctly', () => { + const readonlyTuple = [ref(0)] as const + const reactiveReadonlyTuple = reactive(readonlyTuple) + expectType>(reactiveReadonlyTuple[0]) + + const tuple: [Ref] = [ref(0)] + const reactiveTuple = reactive(tuple) + expectType>(reactiveTuple[0]) +})