Jelajahi Sumber

types(ref): improve UnwrapRef types (#266)

Jooger 6 tahun lalu
induk
melakukan
d8b2b9eb9c
2 mengubah file dengan 15 tambahan dan 8 penghapusan
  1. 1 1
      packages/reactivity/src/computed.ts
  2. 14 7
      packages/reactivity/src/ref.ts

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

@@ -7,7 +7,7 @@ export interface ComputedRef<T> extends WritableComputedRef<T> {
 }
 
 export interface WritableComputedRef<T> extends Ref<T> {
-  readonly effect: ReactiveEffect
+  readonly effect: ReactiveEffect<T>
 }
 
 export interface WritableComputedOptions<T> {

+ 14 - 7
packages/reactivity/src/ref.ts

@@ -2,6 +2,7 @@ import { track, trigger } from './effect'
 import { OperationTypes } from './operations'
 import { isObject } from '@vue/shared'
 import { reactive } from './reactive'
+import { ComputedRef, WritableComputedRef } from './computed'
 
 export const refSymbol = Symbol(__DEV__ ? 'refSymbol' : '')
 
@@ -71,17 +72,23 @@ type BailTypes =
 
 // Recursively unwraps nested value bindings.
 export type UnwrapRef<T> = {
+  cRef: T extends ComputedRef<infer V> ? UnwrapRef<V> : T
+  wcRef: T extends WritableComputedRef<infer V> ? UnwrapRef<V> : T
   ref: T extends Ref<infer V> ? UnwrapRef<V> : T
   array: T extends Array<infer V> ? Array<UnwrapRef<V>> : T
   object: { [K in keyof T]: UnwrapRef<T[K]> }
   stop: T
-}[T extends Ref
-  ? 'ref'
-  : T extends Array<any>
-    ? 'array'
-    : T extends BailTypes
-      ? 'stop' // bail out on types that shouldn't be unwrapped
-      : T extends object ? 'object' : 'stop']
+}[T extends ComputedRef<any>
+  ? 'cRef'
+  : T extends WritableComputedRef<any>
+    ? 'wcRef'
+    : T extends Ref
+      ? 'ref'
+      : T extends Array<any>
+        ? 'array'
+        : T extends BailTypes
+          ? 'stop' // bail out on types that shouldn't be unwrapped
+          : T extends object ? 'object' : 'stop']
 
 // only unwrap nested ref
 export type UnwrapNestedRefs<T> = T extends Ref ? T : UnwrapRef<T>