diff --git a/src/v3/reactivity/ref.ts b/src/v3/reactivity/ref.ts index 244acc9b0d4..33495806da1 100644 --- a/src/v3/reactivity/ref.ts +++ b/src/v3/reactivity/ref.ts @@ -40,9 +40,7 @@ export function isRef(r: any): r is Ref { return !!(r && (r as Ref).__v_isRef === true) } -export function ref( - value: T -): [T] extends [Ref] ? T : Ref> +export function ref(value: T): T export function ref(value: T): Ref> export function ref(): Ref export function ref(value?: unknown) { @@ -53,9 +51,8 @@ declare const ShallowRefMarker: unique symbol export type ShallowRef = Ref & { [ShallowRefMarker]?: true } -export function shallowRef( - value: T -): T extends Ref ? T : ShallowRef +export function shallowRef(value: T | Ref): Ref | ShallowRef +export function shallowRef(value: T): T export function shallowRef(value: T): ShallowRef export function shallowRef(): ShallowRef export function shallowRef(value?: unknown) { diff --git a/types/test/v3/reactivity-test.ts b/types/test/v3/reactivity-test.ts index dd1b2a4d8b6..c357bf8d5c7 100644 --- a/types/test/v3/reactivity-test.ts +++ b/types/test/v3/reactivity-test.ts @@ -15,7 +15,7 @@ import { set, del } from '../../index' -import { describe, expectType } from '../utils' +import { IsUnion, describe, expectType } from '../utils' function plainType(arg: number | Ref) { // ref coercing @@ -385,3 +385,14 @@ describe('set/del', () => { // @ts-expect-error del([], 'fse', 123) }) + + +{ + //#12978 + type Steps = { step: '1' } | { step: '2' } + const shallowUnionGenParam = shallowRef({ step: '1' }) + const shallowUnionAsCast = shallowRef({ step: '1' } as Steps) + + expectType>(false) + expectType>(false) +} \ No newline at end of file diff --git a/types/test/v3/watch-test.ts b/types/test/v3/watch-test.ts index 388fdc2ad9e..aeb5ff36c36 100644 --- a/types/test/v3/watch-test.ts +++ b/types/test/v3/watch-test.ts @@ -1,4 +1,4 @@ -import { ref, computed, watch } from '../../index' +import { ref, computed, watch, shallowRef } from '../../index' import { expectType } from '../utils' const source = ref('foo') @@ -76,3 +76,17 @@ watch([someRef, otherRef], values => { // no type error console.log(value2.a) }) + +{ + //#12978 + type Steps = { step: '1' } | { step: '2' } + const shallowUnionGenParam = shallowRef({ step: '1' }) + const shallowUnionAsCast = shallowRef({ step: '1' } as Steps) + + watch(shallowUnionGenParam, value => { + expectType(value) + }) + watch(shallowUnionAsCast, value => { + expectType(value) + }) +} \ No newline at end of file