Kaynağa Gözat

fix(types): improve ref typing, close #759

Evan You 6 yıl önce
ebeveyn
işleme
627b9df4a2
2 değiştirilmiş dosya ile 18 ekleme ve 2 silme
  1. 2 2
      packages/reactivity/src/ref.ts
  2. 16 0
      test-dts/ref.test-d.ts

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

@@ -23,12 +23,12 @@ export interface Ref<T = any> {
 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) {

+ 16 - 0
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<number>) {
+  // ref coercing
+  const coerced = ref(arg)
+  expectType<Ref<number>>(coerced)
+
+  // isRef as type guard
+  if (isRef(arg)) {
+    expectType<Ref<number>>(arg)
+  }
+}
+
+foo(1)