const convert = <T extends unknown>(val: T): T =>
isObject(val) ? reactive(val) : val
-export function isRef<T>(r: Ref<T> | T): r is Ref<T>
+export function isRef<T>(r: Ref<T> | unknown): r is Ref<T>
export function isRef(r: any): r is Ref {
return r ? r._isRef === true : false
}
-export function ref<T extends Ref>(value: T): T
+export function ref<T>(value: T): T extends Ref ? T : Ref<T>
export function ref<T>(value: T): Ref<T>
export function ref<T = any>(): Ref<T>
export function ref(value?: unknown) {
--- /dev/null
+import { expectType } from 'tsd'
+import { Ref, ref } from './index'
+import { isRef } from '@vue/reactivity'
+
+function foo(arg: number | Ref<number>) {
+ // ref coercing
+ const coerced = ref(arg)
+ expectType<Ref<number>>(coerced)
+
+ // isRef as type guard
+ if (isRef(arg)) {
+ expectType<Ref<number>>(arg)
+ }
+}
+
+foo(1)