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>
}
export type ComputedGetter<T> = () => T
export type ComputedSetter<T> = (v: T) => void
export interface WritableComputedOptions<T> {
get: () => T
set: (v: T) => void
get: ComputedGetter<T>
set: ComputedSetter<T>
}
export function computed<T>(getter: () => T): ComputedRef<T>
export function computed<T>(getter: ComputedGetter<T>): ComputedRef<T>
export function computed<T>(
options: WritableComputedOptions<T>
): WritableComputedRef<T>
export function computed<T>(
getterOrOptions: (() => T) | WritableComputedOptions<T>
getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>
): any {
const isReadonly = isFunction(getterOrOptions)
const getter = isReadonly
? (getterOrOptions as (() => T))
? (getterOrOptions as ComputedGetter<T>)
: (getterOrOptions as WritableComputedOptions<T>).get
const setter = isReadonly
? __DEV__

View File

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

View File

@ -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<any> | WritableComputedOptions<any>
>
export interface MethodOptions {
[key: string]: Function

View File

@ -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<T>(getter: () => T): ComputedRef<T>
export function computed<T>(getter: ComputedGetter<T>): ComputedRef<T>
export function computed<T>(
options: WritableComputedOptions<T>
): WritableComputedRef<T>
export function computed<T>(
getterOrOptions: (() => T) | WritableComputedOptions<T>
getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>
) {
const c = _computed(getterOrOptions as any)
recordEffect(c.effect)