请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Vue3源码的类型声明,有些不理解

老师非常不好意思,又来麻烦你了
我最近在读vue3源码,感觉类型定义的好复杂呀
在ref.ts文件中
export type UnwrapRef = T extends Ref
? UnwrapRefSimple
: UnwrapRefSimple
这里T是一个泛型,infer用在extends语句中的推断,那么他的意思应该是Ref接收的泛型推断出来后存储在V中,
意思就是如果T也是个Ref对象,而且value的类型和V一样,那么条件成立,是这个意思吗?求老师解惑。

第二个问题就是
export type ToRef = [T] extends [Ref] ? T : Ref<UnwrapRef>
为啥是[T] extends [Ref]呢
和 T extends Ref有什么区别吗?

最后一个

https://img1.sycdn.imooc.com//szimg/607cd33e08381e6c18681648.jpg

https://img1.sycdn.imooc.com//szimg/607cd33e08adc1b400000000.jpg

这里在ref.ts中调用的toRaw(this),this应该指的的是ref对象实例吧,那他的身上其实没有第二张图上面的Raw属性,但是ref.value中可能会有。那么即便如此,通过代码逻辑来看,是不是也还是只会返回ref对象本身,而不会会ref.value做任何处理呢

正在回答

1回答

同学你好 第一个问题:infer 在 extends 合用标示将要推断的类型,这句话的意思就是假如 T 是 Ref 类型,那么返回  UnwrapRefSimple<V>,这个 V 是 T 里面的 value 的类型,假如不是 Ref 类型,那直接返回 UnwrapRefSimple<T>

第二个:我本地定义文件是

declare type ToRef<T> = T extends Ref ? T : Ref<UnwrapRef<T>>;
不知道你这个数组类型从哪里来的?

第三个:涉及源代码问题 并没有细读源代码 比较耗时 晚点再回复你啦

0 回复 有任何疑惑可以回复我~
  • 老师,第三个问题,我已经知道了,应该是处理ref作为reactive这种proxy对象的属性值的时候,toRaw中的this就变成了proxy对象。
    第二个问题,可能是因为我的版本吧,我的版本是最新的3.0.11
    第一个问题,我在消化消化....
    回复 有任何疑惑可以回复我~ 2021-04-20 11:50:29
  • 老说可不可以指教下,源码哪几个文件夹是不需要读的
    回复 有任何疑惑可以回复我~ 2021-04-20 12:17:29
  • 非常感谢!
    回复 有任何疑惑可以回复我~ 2021-04-22 16:11:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信