fix(types): improve ref typing, close #759

This commit is contained in:
Evan You 2020-02-21 17:45:42 +01:00
parent 33622d6360
commit 627b9df4a2
2 changed files with 18 additions and 2 deletions

View File

@ -23,12 +23,12 @@ export interface Ref<T = any> {
const convert = <T extends unknown>(val: T): T => const convert = <T extends unknown>(val: T): T =>
isObject(val) ? reactive(val) : val isObject(val) ? reactive(val) : val
export function isRef<T>(r: Ref<T> | T): r is Ref<T> export function isRef<T>(r: Ref<T> | unknown): r is Ref<T>
export function isRef(r: any): r is Ref { export function isRef(r: any): r is Ref {
return r ? r._isRef === true : false return r ? r._isRef === true : false
} }
export function ref<T extends Ref>(value: T): T export function ref<T>(value: T): T extends Ref ? T : Ref<T>
export function ref<T>(value: T): Ref<T> export function ref<T>(value: T): Ref<T>
export function ref<T = any>(): Ref<T> export function ref<T = any>(): Ref<T>
export function ref(value?: unknown) { export function ref(value?: unknown) {

16
test-dts/ref.test-d.ts Normal file
View File

@ -0,0 +1,16 @@
import { expectType } from 'tsd'
import { Ref, ref } from './index'
import { isRef } from '@vue/reactivity'
function foo(arg: number | Ref<number>) {
// ref coercing
const coerced = ref(arg)
expectType<Ref<number>>(coerced)
// isRef as type guard
if (isRef(arg)) {
expectType<Ref<number>>(arg)
}
}
foo(1)