type UnwrapArray<T> = { [P in keyof T]: UnwrapRef<T[P]> }
+// corner case when use narrows type
+// Ex. type RelativePath = string & { __brand: unknown }
+// 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 Array<any>
? 'array'
- : T extends Function | CollectionTypes
+ : T extends Function | CollectionTypes | BaseTypes
? 'ref' // bail out on types that shouldn't be unwrapped
: T extends object ? 'object' : 'ref']
ddd: string[]
}
+ type GT = string & { __brand: unknown }
+
const MyComponent = defineComponent({
props: {
a: Number,
c: ref(1),
d: {
e: ref('hi')
+ },
+ f: {
+ g: ref('hello' as GT)
}
}
},
// assert setup context unwrapping
expectType<number>(this.c)
expectType<string>(this.d.e)
+ expectType<GT>(this.f.g)
// setup context properties should be mutable
this.c = 2