瀏覽代碼

fix(types): fix shallowRef's return type (#12979)

close #12978
Simon Lévesque 2 年之前
父節點
當前提交
a174c29dab
共有 3 個文件被更改,包括 30 次插入8 次删除
  1. 3 6
      src/v3/reactivity/ref.ts
  2. 12 1
      types/test/v3/reactivity-test.ts
  3. 15 1
      types/test/v3/watch-test.ts

+ 3 - 6
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<T extends object>(
-  value: T
-): [T] extends [Ref] ? T : Ref<UnwrapRef<T>>
+export function ref<T extends Ref>(value: T): T
 export function ref<T>(value: T): Ref<UnwrapRef<T>>
 export function ref<T = any>(): Ref<T | undefined>
 export function ref(value?: unknown) {
@@ -53,9 +51,8 @@ declare const ShallowRefMarker: unique symbol
 
 export type ShallowRef<T = any> = Ref<T> & { [ShallowRefMarker]?: true }
 
-export function shallowRef<T extends object>(
-  value: T
-): T extends Ref ? T : ShallowRef<T>
+export function shallowRef<T>(value: T | Ref<T>): Ref<T> | ShallowRef<T>
+export function shallowRef<T extends Ref>(value: T): T
 export function shallowRef<T>(value: T): ShallowRef<T>
 export function shallowRef<T = any>(): ShallowRef<T | undefined>
 export function shallowRef(value?: unknown) {

+ 12 - 1
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<number>) {
   // 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<Steps>({ step: '1' })
+  const shallowUnionAsCast = shallowRef({ step: '1' } as Steps)
+
+  expectType<IsUnion<typeof shallowUnionGenParam>>(false)
+  expectType<IsUnion<typeof shallowUnionAsCast>>(false)
+}

+ 15 - 1
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<Steps>({ step: '1' })
+  const shallowUnionAsCast = shallowRef({ step: '1' } as Steps)
+
+  watch(shallowUnionGenParam, value => {
+    expectType<Steps>(value)
+  })
+  watch(shallowUnionAsCast, value => {
+    expectType<Steps>(value)
+  })
+}