@@ -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