Skip to content

Commit 817d4d1

Browse files
authored
types(reactivity): fix corner case on UnwrapRef (vuejs#261)
1 parent 795dc17 commit 817d4d1

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

src/reactivity/ref.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import { reactive } from './reactive';
66

77
type BailTypes = Function | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any>;
88

9+
// corner case when use narrows type
10+
// Ex. type RelativePath = string & { __brand: unknown }
11+
// RelativePath extends object -> true
12+
type BaseTypes = string | number | boolean;
13+
914
export interface Ref<T> {
1015
value: T;
1116
}
@@ -16,63 +21,63 @@ export interface Ref<T> {
1621
// practical use cases...
1722
export type UnwrapRef<T> = T extends Ref<infer V>
1823
? UnwrapRef2<V>
19-
: T extends BailTypes
24+
: T extends BailTypes | BaseTypes
2025
? T // bail out on types that shouldn't be unwrapped
2126
: T extends object ? { [K in keyof T]: UnwrapRef2<T[K]> } : T
2227

2328
// prettier-ignore
2429
type UnwrapRef2<T> = T extends Ref<infer V>
2530
? UnwrapRef3<V>
26-
: T extends BailTypes
31+
: T extends BailTypes | BaseTypes
2732
? T
2833
: T extends object ? { [K in keyof T]: UnwrapRef3<T[K]> } : T
2934

3035
// prettier-ignore
3136
type UnwrapRef3<T> = T extends Ref<infer V>
3237
? UnwrapRef4<V>
33-
: T extends BailTypes
38+
: T extends BailTypes | BaseTypes
3439
? T
3540
: T extends object ? { [K in keyof T]: UnwrapRef4<T[K]> } : T
3641

3742
// prettier-ignore
3843
type UnwrapRef4<T> = T extends Ref<infer V>
3944
? UnwrapRef5<V>
40-
: T extends BailTypes
45+
: T extends BailTypes | BaseTypes
4146
? T
4247
: T extends object ? { [K in keyof T]: UnwrapRef5<T[K]> } : T
4348

4449
// prettier-ignore
4550
type UnwrapRef5<T> = T extends Ref<infer V>
4651
? UnwrapRef6<V>
47-
: T extends BailTypes
52+
: T extends BailTypes | BaseTypes
4853
? T
4954
: T extends object ? { [K in keyof T]: UnwrapRef6<T[K]> } : T
5055

5156
// prettier-ignore
5257
type UnwrapRef6<T> = T extends Ref<infer V>
5358
? UnwrapRef7<V>
54-
: T extends BailTypes
59+
: T extends BailTypes | BaseTypes
5560
? T
5661
: T extends object ? { [K in keyof T]: UnwrapRef7<T[K]> } : T
5762

5863
// prettier-ignore
5964
type UnwrapRef7<T> = T extends Ref<infer V>
6065
? UnwrapRef8<V>
61-
: T extends BailTypes
66+
: T extends BailTypes | BaseTypes
6267
? T
6368
: T extends object ? { [K in keyof T]: UnwrapRef8<T[K]> } : T
6469

6570
// prettier-ignore
6671
type UnwrapRef8<T> = T extends Ref<infer V>
6772
? UnwrapRef9<V>
68-
: T extends BailTypes
73+
: T extends BailTypes | BaseTypes
6974
? T
7075
: T extends object ? { [K in keyof T]: UnwrapRef9<T[K]> } : T
7176

7277
// prettier-ignore
7378
type UnwrapRef9<T> = T extends Ref<infer V>
7479
? UnwrapRef10<V>
75-
: T extends BailTypes
80+
: T extends BailTypes | BaseTypes
7681
? T
7782
: T extends object ? { [K in keyof T]: UnwrapRef10<T[K]> } : T
7883

0 commit comments

Comments
 (0)