From 57c676c6bcc79de85c464e8a2c439779ebabcef5 Mon Sep 17 00:00:00 2001 From: yoyo930021 Date: Mon, 24 Feb 2020 18:26:32 +0800 Subject: [PATCH] types(reactivity): fix corner case on UnwrapRef --- src/reactivity/ref.ts | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/reactivity/ref.ts b/src/reactivity/ref.ts index 8d54be8b..4b704b7d 100644 --- a/src/reactivity/ref.ts +++ b/src/reactivity/ref.ts @@ -6,6 +6,11 @@ import { reactive } from './reactive'; type BailTypes = Function | Map | Set | WeakMap | WeakSet; +// corner case when use narrows type +// Ex. type RelativePath = string & { __brand: unknown } +// RelativePath extends object -> true +type BaseTypes = string | number | boolean; + export interface Ref { value: T; } @@ -16,63 +21,63 @@ export interface Ref { // practical use cases... export type UnwrapRef = T extends Ref ? UnwrapRef2 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T // bail out on types that shouldn't be unwrapped : T extends object ? { [K in keyof T]: UnwrapRef2 } : T // prettier-ignore type UnwrapRef2 = T extends Ref ? UnwrapRef3 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef3 } : T // prettier-ignore type UnwrapRef3 = T extends Ref ? UnwrapRef4 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef4 } : T // prettier-ignore type UnwrapRef4 = T extends Ref ? UnwrapRef5 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef5 } : T // prettier-ignore type UnwrapRef5 = T extends Ref ? UnwrapRef6 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef6 } : T // prettier-ignore type UnwrapRef6 = T extends Ref ? UnwrapRef7 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef7 } : T // prettier-ignore type UnwrapRef7 = T extends Ref ? UnwrapRef8 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef8 } : T // prettier-ignore type UnwrapRef8 = T extends Ref ? UnwrapRef9 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef9 } : T // prettier-ignore type UnwrapRef9 = T extends Ref ? UnwrapRef10 - : T extends BailTypes + : T extends BailTypes | BaseTypes ? T : T extends object ? { [K in keyof T]: UnwrapRef10 } : T