]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
types: improve type 'ReactiveEffect' with generics (#99)
author扩散性百万甜面包 <himself65@outlook.com>
Tue, 8 Oct 2019 17:48:13 +0000 (01:48 +0800)
committerEvan You <yyx990803@gmail.com>
Tue, 8 Oct 2019 17:48:13 +0000 (13:48 -0400)
packages/reactivity/src/effect.ts
packages/runtime-core/src/apiWatch.ts

index a542e3b6502c9b231af3fa941c4c2b1a1c3040a9..b476008857bdead81a5f904e8871eb5b64d9f9da 100644 (file)
@@ -2,11 +2,11 @@ import { OperationTypes } from './operations'
 import { Dep, targetMap } from './reactive'
 import { EMPTY_OBJ, extend } from '@vue/shared'
 
-export interface ReactiveEffect {
-  (): any
+export interface ReactiveEffect<T = any> {
+  (): T
   isEffect: true
   active: boolean
-  raw: Function
+  raw: () => T
   deps: Array<Dep>
   computed?: boolean
   scheduler?: (run: Function) => void
@@ -35,10 +35,10 @@ export const activeReactiveEffectStack: ReactiveEffect[] = []
 
 export const ITERATE_KEY = Symbol('iterate')
 
-export function effect(
-  fn: Function,
+export function effect<T = any>(
+  fn: () => T,
   options: ReactiveEffectOptions = EMPTY_OBJ
-): ReactiveEffect {
+): ReactiveEffect<T> {
   if ((fn as ReactiveEffect).isEffect) {
     fn = (fn as ReactiveEffect).raw
   }
@@ -59,13 +59,13 @@ export function stop(effect: ReactiveEffect) {
   }
 }
 
-function createReactiveEffect(
-  fn: Function,
+function createReactiveEffect<T = any>(
+  fn: () => T,
   options: ReactiveEffectOptions
-): ReactiveEffect {
-  const effect = function effect(...args): any {
+): ReactiveEffect<T> {
+  const effect: ReactiveEffect = function effect(...args: any[]): any {
     return run(effect as ReactiveEffect, fn, args)
-  } as ReactiveEffect
+  }
   effect.isEffect = true
   effect.active = true
   effect.raw = fn
index 8a72d686047566df891d6af8327bfdbfc159d744..ebbe33c215132f0156334977378de90ea2a48980 100644 (file)
@@ -91,7 +91,7 @@ function doWatch(
   const instance = currentInstance
   const suspense = currentSuspense
 
-  let getter: Function
+  let getter: () => any
   if (isArray(source)) {
     getter = () =>
       source.map(