Skip to content

Commit c6b7afc

Browse files
Andrew / Kanayyx990803
authored andcommitted
types: use recursion for unwrapping refs (#137)
1 parent 4fc2174 commit c6b7afc

File tree

1 file changed

+11
-76
lines changed

1 file changed

+11
-76
lines changed

packages/reactivity/src/ref.ts

Lines changed: 11 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -68,80 +68,15 @@ type BailTypes =
6868
| WeakSet<any>
6969

7070
// Recursively unwraps nested value bindings.
71-
// Unfortunately TS cannot do recursive types, but this should be enough for
72-
// practical use cases...
73-
export type UnwrapRef<T> = T extends Ref<infer V>
74-
? UnwrapRef2<V>
75-
: T extends Array<infer V>
76-
? Array<UnwrapRef2<V>>
71+
export type UnwrapRef<T> = {
72+
ref: T extends Ref<infer V> ? UnwrapRef<V> : T
73+
array: T extends Array<infer V> ? Array<UnwrapRef<V>> : T
74+
object: { [K in keyof T]: UnwrapRef<T[K]> }
75+
stop: T
76+
}[T extends Ref<any>
77+
? 'ref'
78+
: T extends Array<any>
79+
? 'array'
7780
: T extends BailTypes
78-
? T // bail out on types that shouldn't be unwrapped
79-
: T extends object ? { [K in keyof T]: UnwrapRef2<T[K]> } : T
80-
81-
type UnwrapRef2<T> = T extends Ref<infer V>
82-
? UnwrapRef3<V>
83-
: T extends Array<infer V>
84-
? Array<UnwrapRef3<V>>
85-
: T extends BailTypes
86-
? T
87-
: T extends object ? { [K in keyof T]: UnwrapRef3<T[K]> } : T
88-
89-
type UnwrapRef3<T> = T extends Ref<infer V>
90-
? UnwrapRef4<V>
91-
: T extends Array<infer V>
92-
? Array<UnwrapRef4<V>>
93-
: T extends BailTypes
94-
? T
95-
: T extends object ? { [K in keyof T]: UnwrapRef4<T[K]> } : T
96-
97-
type UnwrapRef4<T> = T extends Ref<infer V>
98-
? UnwrapRef5<V>
99-
: T extends Array<infer V>
100-
? Array<UnwrapRef5<V>>
101-
: T extends BailTypes
102-
? T
103-
: T extends object ? { [K in keyof T]: UnwrapRef5<T[K]> } : T
104-
105-
type UnwrapRef5<T> = T extends Ref<infer V>
106-
? UnwrapRef6<V>
107-
: T extends Array<infer V>
108-
? Array<UnwrapRef6<V>>
109-
: T extends BailTypes
110-
? T
111-
: T extends object ? { [K in keyof T]: UnwrapRef6<T[K]> } : T
112-
113-
type UnwrapRef6<T> = T extends Ref<infer V>
114-
? UnwrapRef7<V>
115-
: T extends Array<infer V>
116-
? Array<UnwrapRef7<V>>
117-
: T extends BailTypes
118-
? T
119-
: T extends object ? { [K in keyof T]: UnwrapRef7<T[K]> } : T
120-
121-
type UnwrapRef7<T> = T extends Ref<infer V>
122-
? UnwrapRef8<V>
123-
: T extends Array<infer V>
124-
? Array<UnwrapRef8<V>>
125-
: T extends BailTypes
126-
? T
127-
: T extends object ? { [K in keyof T]: UnwrapRef8<T[K]> } : T
128-
129-
type UnwrapRef8<T> = T extends Ref<infer V>
130-
? UnwrapRef9<V>
131-
: T extends Array<infer V>
132-
? Array<UnwrapRef9<V>>
133-
: T extends BailTypes
134-
? T
135-
: T extends object ? { [K in keyof T]: UnwrapRef9<T[K]> } : T
136-
137-
type UnwrapRef9<T> = T extends Ref<infer V>
138-
? UnwrapRef10<V>
139-
: T extends Array<infer V>
140-
? Array<UnwrapRef10<V>>
141-
: T extends BailTypes
142-
? T
143-
: T extends object ? { [K in keyof T]: UnwrapRef10<T[K]> } : T
144-
145-
type UnwrapRef10<T> = T extends Ref<infer V>
146-
? V // stop recursion
147-
: T
81+
? 'stop' // bail out on types that shouldn't be unwrapped
82+
: T extends object ? 'object' : 'stop']

0 commit comments

Comments
 (0)