diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 65e1b8dd016..b36b3308b39 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -23,12 +23,12 @@ export interface Ref { const convert = (val: T): T => isObject(val) ? reactive(val) : val -export function isRef(r: Ref | T): r is Ref +export function isRef(r: Ref | unknown): r is Ref export function isRef(r: any): r is Ref { return r ? r._isRef === true : false } -export function ref(value: T): T +export function ref(value: T): T extends Ref ? T : Ref export function ref(value: T): Ref export function ref(): Ref export function ref(value?: unknown) { diff --git a/test-dts/ref.test-d.ts b/test-dts/ref.test-d.ts new file mode 100644 index 00000000000..ad8c22fef61 --- /dev/null +++ b/test-dts/ref.test-d.ts @@ -0,0 +1,16 @@ +import { expectType } from 'tsd' +import { Ref, ref } from './index' +import { isRef } from '@vue/reactivity' + +function foo(arg: number | Ref) { + // ref coercing + const coerced = ref(arg) + expectType>(coerced) + + // isRef as type guard + if (isRef(arg)) { + expectType>(arg) + } +} + +foo(1)