types: improve computed types (#343)

This commit is contained in:
Dmitry Sharshakov 2019-10-21 20:57:20 +03:00 committed by Evan You
parent 1f4937c2fd
commit 74d8c5919d
4 changed files with 24 additions and 18 deletions

View File

@ -10,21 +10,24 @@ export interface WritableComputedRef<T> extends Ref<T> {
readonly effect: ReactiveEffect<T> readonly effect: ReactiveEffect<T>
} }
export type ComputedGetter<T> = () => T
export type ComputedSetter<T> = (v: T) => void
export interface WritableComputedOptions<T> { export interface WritableComputedOptions<T> {
get: () => T get: ComputedGetter<T>
set: (v: T) => void set: ComputedSetter<T>
} }
export function computed<T>(getter: () => T): ComputedRef<T> export function computed<T>(getter: ComputedGetter<T>): ComputedRef<T>
export function computed<T>( export function computed<T>(
options: WritableComputedOptions<T> options: WritableComputedOptions<T>
): WritableComputedRef<T> ): WritableComputedRef<T>
export function computed<T>( export function computed<T>(
getterOrOptions: (() => T) | WritableComputedOptions<T> getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>
): any { ): any {
const isReadonly = isFunction(getterOrOptions) const isReadonly = isFunction(getterOrOptions)
const getter = isReadonly const getter = isReadonly
? (getterOrOptions as (() => T)) ? (getterOrOptions as ComputedGetter<T>)
: (getterOrOptions as WritableComputedOptions<T>).get : (getterOrOptions as WritableComputedOptions<T>).get
const setter = isReadonly const setter = isReadonly
? __DEV__ ? __DEV__

View File

@ -12,7 +12,9 @@ export {
computed, computed,
ComputedRef, ComputedRef,
WritableComputedRef, WritableComputedRef,
WritableComputedOptions WritableComputedOptions,
ComputedGetter,
ComputedSetter
} from './computed' } from './computed'
export { export {
effect, effect,

View File

@ -30,7 +30,11 @@ import {
DebuggerHook, DebuggerHook,
ErrorCapturedHook ErrorCapturedHook
} from './apiLifecycle' } from './apiLifecycle'
import { reactive } from '@vue/reactivity' import {
reactive,
ComputedGetter,
WritableComputedOptions
} from '@vue/reactivity'
import { ComponentObjectPropsOptions, ExtractPropTypes } from './componentProps' import { ComponentObjectPropsOptions, ExtractPropTypes } from './componentProps'
import { Directive } from './directives' import { Directive } from './directives'
import { ComponentPublicInstance } from './componentProxy' import { ComponentPublicInstance } from './componentProxy'
@ -100,14 +104,10 @@ export type ComponentOptions =
// TODO legacy component definition also supports constructors with .options // TODO legacy component definition also supports constructors with .options
type LegacyComponent = ComponentOptions type LegacyComponent = ComponentOptions
export interface ComputedOptions { export type ComputedOptions = Record<
[key: string]: string,
| Function ComputedGetter<any> | WritableComputedOptions<any>
| { >
get: Function
set: Function
}
}
export interface MethodOptions { export interface MethodOptions {
[key: string]: Function [key: string]: Function

View File

@ -26,7 +26,8 @@ import {
ComputedRef, ComputedRef,
WritableComputedOptions, WritableComputedOptions,
ReactiveEffect, ReactiveEffect,
WritableComputedRef WritableComputedRef,
ComputedGetter
} from '@vue/reactivity' } from '@vue/reactivity'
import { currentInstance } from './component' import { currentInstance } from './component'
@ -39,12 +40,12 @@ export function recordEffect(effect: ReactiveEffect) {
} }
} }
export function computed<T>(getter: () => T): ComputedRef<T> export function computed<T>(getter: ComputedGetter<T>): ComputedRef<T>
export function computed<T>( export function computed<T>(
options: WritableComputedOptions<T> options: WritableComputedOptions<T>
): WritableComputedRef<T> ): WritableComputedRef<T>
export function computed<T>( export function computed<T>(
getterOrOptions: (() => T) | WritableComputedOptions<T> getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>
) { ) {
const c = _computed(getterOrOptions as any) const c = _computed(getterOrOptions as any)
recordEffect(c.effect) recordEffect(c.effect)