// corner case when use narrows type
// Ex. type RelativePath = string & { __brand: unknown }
// RelativePath extends object -> true
-type BaseTypes = string | number | boolean
+type BaseTypes = string | number | boolean | Node | Window
// Recursively unwraps nested value bindings.
export type UnwrapRef<T> = {
import { expectType } from 'tsd'
import { Ref, ref, isRef, unref } from './index'
-function foo(arg: number | Ref<number>) {
+function plainType(arg: number | Ref<number>) {
// ref coercing
const coerced = ref(arg)
expectType<Ref<number>>(coerced)
expectType<{ foo: number }>(nestedRef.value)
}
-foo(1)
+plainType(1)
+
+function bailType(arg: HTMLElement | Ref<HTMLElement>) {
+ // ref coercing
+ const coerced = ref(arg)
+ expectType<Ref<HTMLElement>>(coerced)
+
+ // isRef as type guard
+ if (isRef(arg)) {
+ expectType<Ref<HTMLElement>>(arg)
+ }
+
+ // ref unwrapping
+ expectType<HTMLElement>(unref(arg))
+
+ // ref inner type should be unwrapped
+ const nestedRef = ref({ foo: ref(document.createElement('DIV')) })
+
+ expectType<Ref<{ foo: HTMLElement }>>(nestedRef)
+ expectType<{ foo: HTMLElement }>(nestedRef.value)
+}
+const el = document.createElement('DIV')
+bailType(el)