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

来源:9-6 改进路由验证系统

有没有没被占用的昵称

2021-04-18

老师非常不好意思,又来麻烦你了
我最近在读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有什么区别吗?

最后一个

http://img.mukewang.com/szimg/607cd33e08381e6c18681648.jpg

http://img.mukewang.com/szimg/607cd33e08adc1b400000000.jpg

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

写回答

1回答

张轩

2021-04-20

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

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

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

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

0
3
有没有没被占用的昵称
非常感谢!
2021-04-22
共3条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3142 学习 · 2313 问题

查看课程