TypeScript 之 参数属性

前言

最近在阅读 vue3 的源码,众所周知 vue3 就是使用 ts 编写的,在读到 effect 的源码的时候,有一个地方的代码一开始让我一脸懵逼,先来看看源代码:

在 packages\reactivity\src\effect.ts 这个文件里面有一个 ReactiveEffect 类,他在初始化的构造函数是这样的:

ts 复制代码
  constructor(
    public fn: () => T,
    public scheduler: EffectScheduler | null = null,
    scope?: EffectScope
  ) {
    recordEffectScope(this, scope)
  }

然后对应的,初始化的逻辑是

ts 复制代码
export function effect<T = any>(
  fn: () => T,
  options?: ReactiveEffectOptions
): ReactiveEffectRunner {
  ...
  const _effect = new ReactiveEffect(fn)
  ...
}

可以看到初始化的时候只传入了一个 fn 参数,并且在构造函数里面没有任何的赋值操作,压根没有引用,但是在后面其他函数的触发过程中,this 对象上的 fn 却莫名其妙的有了赋值,而且就是我们传入的这个 fn

当时断点到这的时候就让我百思不得其解,明明没有进行赋值,这个fn的内容是怎么来的?这里就可以引出 ts 在类里面的一个特性 参数属性(Parameter Properties)

参数属性(Parameter Properties)

在官方的文档中是这样介绍这个特性的:

TypeScript offers special syntax for turning a constructor parameter into a class property with the same name and value. These are called parameter properties and are created by prefixing a constructor argument with one of the visibility modifiers public, private, protected, or readonly.

翻译过来就是 TypeScript提供了特殊的语法,我们可以将构造函数的参数转为相同名称和值的类属性,通过在构造函数参数前添加可见性修饰符(publicprivateprotectedreadonly)就可以实现。

我们来模拟一下 vue3 源码中的例子

ts 复制代码
class ReactiveEffect {
  constructor(
    public fn: () => any
  ) {
  }
}

const a = new ReactiveEffect(()=>{const a = 111})

console.log(a.fn) // [LOG]: () => { const a = 111; }

可以看到fn这个属性确实成功的赋值了,这也就解决了上面的疑惑。

结语

本文主要是记录在vue3源码的学习过程中碰到的小知识点,用这篇文章做一个总结

引用

TypeScript: Documentation - Classes

相关推荐
AI浩3 小时前
【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程
运维·服务器·前端
涔溪3 小时前
CSS 网格布局(Grid Layout)核心概念、基础语法、常用属性、实战示例和进阶技巧全面讲解
前端·css
2401_878454533 小时前
浏览器工作原理
前端·javascript
西陵4 小时前
为什么说 AI 赋能前端开发,已经不是选择题,而是必然趋势?
前端·架构·ai编程
by__csdn5 小时前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
天天扭码5 小时前
前端如何实现RAG?一文带你速通,使用RAG实现长期记忆
前端·node.js·ai编程
Luna-player6 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
lionliu05196 小时前
js的扩展运算符的理解
前端·javascript·vue.js
小草cys6 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
奇舞精选6 小时前
GELab-Zero 技术解析:当豆包联手中兴,开源界如何守住端侧 AI 的“最后防线”?
前端·aigc