// RelativePath extends object -> true
type BaseTypes = string | number | boolean
-// Recursively unwraps nested value bindings.
-export type UnwrapRef<T> = {
- cRef: T extends ComputedRef<infer V> ? UnwrapRef<V> : T
- ref: T extends Ref<infer V> ? UnwrapRef<V> : T
- array: T
- object: { [K in keyof T]: UnwrapRef<T[K]> }
-}[T extends ComputedRef<any>
- ? 'cRef'
- : T extends Array<any>
- ? 'array'
- : T extends Ref | Function | CollectionTypes | BaseTypes
- ? 'ref' // bail out on types that shouldn't be unwrapped
- : T extends object ? 'object' : 'ref']
+// Super simple tuple checker
+type Tupple<T extends Array<any>> = T[0] extends T[1]
+ ? T[1] extends T[2] ? never : true
+ : true
+
+export type UnwrapRef<T> = T extends ComputedRef<infer V>
+ ? UnwrapRefSimple<V>
+ : T extends Ref<infer V> ? UnwrapRefSimple<V> : UnwrapRefSimple<T>
+
+type UnwrapRefSimple<T> = T extends Function | CollectionTypes | BaseTypes | Ref
+ ? T
+ : T extends Array<infer V>
+ ? Tupple<T> extends never ? Array<V> : UnwrapTupple<T>
+ : T extends object ? UnwrappedObject<T> : T
+
+export type UnwrapTupple<T> = { [P in keyof T]: T[P] } & {
+ length: number
+ [Symbol.iterator]: any
+ [Symbol.unscopables]: any
+}
+
+// interface UnwrappedArray<T> extends Array<T> {}
+
+type UnwrappedObject<T> = { [P in keyof T]: UnwrapRef<T[P]> }