From 74d8c5919dacdccc95b6df35cdf3f34afcb62162 Mon Sep 17 00:00:00 2001 From: Dmitry Sharshakov Date: Mon, 21 Oct 2019 20:57:20 +0300 Subject: [PATCH] types: improve computed types (#343) --- packages/reactivity/src/computed.ts | 13 ++++++++----- packages/reactivity/src/index.ts | 4 +++- packages/runtime-core/src/apiOptions.ts | 18 +++++++++--------- packages/runtime-core/src/apiReactivity.ts | 7 ++++--- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index c0af4a6478..162eb76738 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -10,21 +10,24 @@ export interface WritableComputedRef extends Ref { readonly effect: ReactiveEffect } +export type ComputedGetter = () => T +export type ComputedSetter = (v: T) => void + export interface WritableComputedOptions { - get: () => T - set: (v: T) => void + get: ComputedGetter + set: ComputedSetter } -export function computed(getter: () => T): ComputedRef +export function computed(getter: ComputedGetter): ComputedRef export function computed( options: WritableComputedOptions ): WritableComputedRef export function computed( - getterOrOptions: (() => T) | WritableComputedOptions + getterOrOptions: ComputedGetter | WritableComputedOptions ): any { const isReadonly = isFunction(getterOrOptions) const getter = isReadonly - ? (getterOrOptions as (() => T)) + ? (getterOrOptions as ComputedGetter) : (getterOrOptions as WritableComputedOptions).get const setter = isReadonly ? __DEV__ diff --git a/packages/reactivity/src/index.ts b/packages/reactivity/src/index.ts index febfac082b..5525e2274f 100644 --- a/packages/reactivity/src/index.ts +++ b/packages/reactivity/src/index.ts @@ -12,7 +12,9 @@ export { computed, ComputedRef, WritableComputedRef, - WritableComputedOptions + WritableComputedOptions, + ComputedGetter, + ComputedSetter } from './computed' export { effect, diff --git a/packages/runtime-core/src/apiOptions.ts b/packages/runtime-core/src/apiOptions.ts index d3a87ade6d..ad1c29b437 100644 --- a/packages/runtime-core/src/apiOptions.ts +++ b/packages/runtime-core/src/apiOptions.ts @@ -30,7 +30,11 @@ import { DebuggerHook, ErrorCapturedHook } from './apiLifecycle' -import { reactive } from '@vue/reactivity' +import { + reactive, + ComputedGetter, + WritableComputedOptions +} from '@vue/reactivity' import { ComponentObjectPropsOptions, ExtractPropTypes } from './componentProps' import { Directive } from './directives' import { ComponentPublicInstance } from './componentProxy' @@ -100,14 +104,10 @@ export type ComponentOptions = // TODO legacy component definition also supports constructors with .options type LegacyComponent = ComponentOptions -export interface ComputedOptions { - [key: string]: - | Function - | { - get: Function - set: Function - } -} +export type ComputedOptions = Record< + string, + ComputedGetter | WritableComputedOptions +> export interface MethodOptions { [key: string]: Function diff --git a/packages/runtime-core/src/apiReactivity.ts b/packages/runtime-core/src/apiReactivity.ts index 76092b9f34..d603257249 100644 --- a/packages/runtime-core/src/apiReactivity.ts +++ b/packages/runtime-core/src/apiReactivity.ts @@ -26,7 +26,8 @@ import { ComputedRef, WritableComputedOptions, ReactiveEffect, - WritableComputedRef + WritableComputedRef, + ComputedGetter } from '@vue/reactivity' import { currentInstance } from './component' @@ -39,12 +40,12 @@ export function recordEffect(effect: ReactiveEffect) { } } -export function computed(getter: () => T): ComputedRef +export function computed(getter: ComputedGetter): ComputedRef export function computed( options: WritableComputedOptions ): WritableComputedRef export function computed( - getterOrOptions: (() => T) | WritableComputedOptions + getterOrOptions: ComputedGetter | WritableComputedOptions ) { const c = _computed(getterOrOptions as any) recordEffect(c.effect) -- 2.47.3