Ref类型的第一版实现

简单解释下,首先定义一个Ref类型,这个类型的value可以是任意类型(any),然后再定义一个ref的函数,接受一个任意类型的参数T,再将T封装成Ref类型返回。由上图我们可以看到,我们输入了number类型的值,由泛型的反向推到我们可以知道,返回的count是Ref<number>,所以count.value为number类型。

第二版本:

考虑到ref嵌套的问题,我们期望直接通过count.value获取,而不是count.value.value.value.value。这时候我们需要对一版本进行改进。

由上图可是,对于ref函数的返回时,我们进行了条件判断, 如果传入的参数是Ref类型,函数将原封不动返回这个Ref类型,否则需要将T包装成Ref类型再进行返回。

这样针对ref(ref(2))这种嵌套场景,首先内层的ref(2)返回的是Ref<number>类型,然后外层的ref通过判断,将内层的Ref<number>类型直接返回。这返回值依然形如{value:number}的对象。而不是{value:{value:number}}。

步骤二: UnwrapRef

UnwrapRef<T>类型,就是对Ref类型就行反解,其作用分为:

a.如果泛型T是Ref<R>类型,则UnwrapRef类型为ref.value的类型(R)

b.如果泛型T不是Ref类型,则UnwrapRef类型为T

由上面的分析我们可以定义如下图的方式定义UnwrapRef: