Browse Source

fix(toRef): ref created from union typed prop can't be used in watch (#3048)

07akioni 5 năm trước cách đây
mục cha
commit
4ca4666d58
2 tập tin đã thay đổi với 11 bổ sung2 xóa
  1. 1 1
      packages/reactivity/src/ref.ts
  2. 10 1
      test-dts/ref.test-d.ts

+ 1 - 1
packages/reactivity/src/ref.ts

@@ -20,7 +20,7 @@ export interface Ref<T = any> {
   _shallow?: boolean
 }
 
-export type ToRef<T> = T extends Ref ? T : Ref<UnwrapRef<T>>
+export type ToRef<T> = [T] extends [Ref] ? T : Ref<UnwrapRef<T>>
 export type ToRefs<T = any> = {
   // #2687: somehow using ToRef<T[K]> here turns the resulting type into
   // a union of multiple Ref<*> types instead of a single Ref<* | *> type.

+ 10 - 1
test-dts/ref.test-d.ts

@@ -9,7 +9,8 @@ import {
   proxyRefs,
   toRef,
   toRefs,
-  ToRefs
+  ToRefs,
+  watch
 } from './index'
 
 function plainType(arg: number | Ref<number>) {
@@ -165,6 +166,14 @@ const obj = {
 expectType<Ref<number>>(toRef(obj, 'a'))
 expectType<Ref<number>>(toRef(obj, 'b'))
 
+const objWithUnionProp: { a: string | number } = {
+  a: 1
+}
+
+watch(toRef(objWithUnionProp, 'a'), value => {
+  expectType<string | number>(value)
+})
+
 // toRefs
 const objRefs = toRefs(obj)
 expectType<{