被迫开始学习Typescript —— class

TS 的 class 看起来和 ES6 的 Class 有点像,基本上差别不大,除了 可以继承(实现)接口、私有成员、只读等之外。

参考:https://typescript.bootcss.com/classes.html

基本用法

我们可以定义一个 class,设置几个属性,然后设置一个方法,封装 Object.assign 简化reactive 的赋值操作。

  • 创建自己的对象基类
  import type { InjectionKey } from 'vue'

  class BaseObject {
    $id: string | symbol | InjectionKey
    name: string
    age: number

    constructor (id: string, name: string, age: number) {
      this.$id = id
      this.name = name
      this.age = age
    }

    set $state(value: any) {
      Object.assign(this, value)
    }
  }
  • 使用
  import { reactive, defineComponent } from 'vue'

  const _state = new BaseObject('007', 'jyk')
  const state = reactive(_state)

  state.$state = {
    name: '直接赋值'
  }

看着是不是眼熟?你猜对了!这里参考 Pinia 设置 $state ,实现给 reactive 直接赋值的功能。

reactive 哪都好,只是整体赋值的时候有点郁闷,这里简单封装了一下,实现直接赋值的功能。

类的继承

上面的方法只是封装了对象,那么数组怎么办呢?这里就需要用到”继承” extends 的用法。

  • 继承 js 的 Array 创建自己的数组类
  class BaseArray extends Array  {
    $id: string | symbol | InjectionKey

    constructor () {
      // 调用父类的 constructor()
      super()
      this.$id = 'array'
    }

    set $state(value: any) {
      this.length = 0
      if (Array.isArray(value)) {
        this.push(...value)
      } else {
        this.push(value)
      }
    }
  }
  • 使用
const _state2 = new BaseArray()
const state2 = reactive(_state2)

state2.$state = [
  {
    name: '008'
  },
  {
    name: '009'
  }
]

这样数组形式的 reactive ,也可以直接赋值了,是不是方便很多?

继承的是原生数组,所以拥有了数组的所有功能。
另外,子类的constructor里面,需要调用 super() 才会有 this。

实现接口

观察上面的两个 class,会发现拥有相同的成员:$id 和 $state。那么要不要约束一下?

如果想要实现约束功能的话,可以定义一个 interface 来实现。

  • 定义接口
  interface IState {
    $id: string | symbol | InjectionKey
    set $state(value: any)
  }
  • 实现接口
  class BaseObject implements IState {
    略
  }

  class BaseArray extends Array implements IState {
    略
  }

这样设置之后,类的成员就要复合接口的定义,不符合的话会出现提示。

私有成员、只读成员

虽然可以使用 private、readonly 标识私有成员和只读成员,只是嘛,到目前为止有点鸡肋。因为只是在 TS 的范畴内给出错误提示,但是完全不影响运行。

那么能不能变相实现一下呢?可以的,只是有点绕圈圈,另外似乎不太正规。

我们把 $id 改为只读、伪隐藏成员。

  • 修改一下接口,使用访问器(get)设置 $id
  interface IState {
    get $id(): string | symbol | InjectionKey
    set $state(value: any)
  }
  • 修改一下对象基类,使用 get 访问器
  class BaseObject implements IState {
    get $id(): string | symbol | InjectionKey
    略
  }
  • 创建对象实例的函数
  function createState(id: string, name: string, age: number) {
    // 继承 BaseObject 再定义一个class
    class myState extends BaseObject {
      constructor (name: string, age: number) {
        // 调用父类的 constructor()
        super(name, age)
      }
      // 使用 override 覆盖父类 $id
      override get $id() {
        return id
      }
    }

    const _state = new myState(name, age)
    const state = reactive(_state)

    return state
  }
  • 使用
  const state3 = createState('010', 'jyk0013', 29)
  console.log(state3)
  console.log('state3 - keys', Object.keys(state3))
  for (const key in state3) {
    console.log(key, state3[key])
  }
  • 效果

被迫开始学习Typescript —— class
  • 分析

把 $id 改为 get 访问器的方式,可以实现 readonly 的效果。

$id 放在 class (myState) 的”原型”上面,可以避免被遍历出来,这样就实现了伪隐藏的效果。

当然 使用 state.$id 的方式还是可以访问到的,所以是伪隐藏。

完整项目代码

https://gitee.com/naturefw-code/nf-rollup-state

Original: https://www.cnblogs.com/jyk/p/16275700.html
Author: 金色海洋(jyk)
Title: 被迫开始学习Typescript —— class

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549188/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • playwright-自动化(三): 跳过检测 使用正常谷歌 指定用户数据 下载文件

    还是前两天做一个商城后台爬虫,限制用户缓存,不能用谷歌开发版本,同时需要下载文件。 import getpass from playwright.sync_api import s…

    技术杂谈 2023年7月11日
    0122
  • Ubuntu 20.04利用SystemMonitor显示CPU、GPU温度等信息

    Ubuntu下总是使用终端命令查看CPU、GPU温度有点麻烦,利用自带的SystemMonitor来显示这些信息较为简单。 1、添加仓库进行安装 sudo add-apt-repo…

    技术杂谈 2023年7月11日
    096
  • Pycharm k火秘诀插件

    Pycharm2020最新永久激活码插件(支持Windows),100%永久激活 用到pycharm工具发现没用多久时间又过期了,在网上有看到很多朋友都遇到同样的情况,于是找到了一…

    技术杂谈 2023年6月21日
    0148
  • SpringMVC 使用注解时路径找不到

    SpringMVC 注解路径找不到 今天在使用SpringMVC时偶然遇到了跳转 404 的问题,于是决定记录下来 启动后输入 @RequestMapping(“/lo…

    技术杂谈 2023年7月11日
    069
  • Nginx 开源版编译安装教程

    本文示例在虚拟机 Rocky Linux 8.5 系统中编译安装 Nginx 开源版软件。 关于虚拟机 Rocky Linux 8.5 系统的安装配置教程可参考这篇文章:VMwar…

    技术杂谈 2023年7月11日
    086
  • Linux快速安装流量监控工具(实用版)

    前言: Linux流量监控工具,在此我推荐两种分别为: 1、nload(推荐)因为个人看着舒服点😂 2、iftop 以上两种任选其一即可,在此对两种都有介绍和安装教程,我写了,大家…

    技术杂谈 2023年6月21日
    0110
  • 二维数组及滚动数组

    二维数组及滚动数组总结 在二维数组 num[i][j]中,每个元素都是一个数组。有时候,二维数组中的某些元素在整个运算过程中都需要用到;但是有的时候我们只需要用到前一个或者两个数组…

    技术杂谈 2023年6月21日
    0100
  • 基于 Next.js实现在线Excel

    如果要从头开始使用 React 构建一个完整的 Web 应用程序,需要哪些步骤?这当然不像把大象装进冰箱那么简单,只需要分成三步:打开冰箱,拿起大象,塞进冰箱就好。 我们需要考虑细…

    技术杂谈 2023年5月31日
    0115
  • mysql扫描全表更新状态部分失败

    一直以为mysql是按照主键排序的,实则排序和主键没有关系(不使用 order by 子句)。 然后从 stackoverflow 上查了一下,找到了以下的回答: 没有默认的排序顺…

    技术杂谈 2023年7月25日
    077
  • 全新升级的AOP框架Dora.Interception[汇总,共6篇]

    多年之前利用IL Emit写了一个名为Dora.Interception(github地址,觉得不错不妨给一颗星)的AOP框架。前几天利用Roslyn的Source Generat…

    技术杂谈 2023年5月31日
    097
  • 配置中心Nacos(服务发现)

    服务演变之路 单体应用架构 在刚开始的时候,企业的用户量、数据量规模都⽐较⼩,项⽬所有的功能模块都放在⼀个⼯程中编码、编译、打包并且部署在⼀个Tomcat容器中的架构模式就是单体应…

    技术杂谈 2023年7月11日
    0107
  • 【软考】信息安全审计

    1.概念 安全审计(Security Audit)是记录、审查主体对客体进行访问和使用情况,保证安全规则被正确执行,并帮助分析安全事故产生的原因。 安全审计系统采用数据挖掘和数据仓…

    技术杂谈 2023年5月31日
    094
  • cuda安装及百度云链接

    1、cuda11.1、11.0、10.2、10.1、10.0、8.0及其相应的cudnn版本 本篇文章是基于移动端1050ti win10安装CUDA 10.0的经验写,由于官网下…

    技术杂谈 2023年7月24日
    075
  • c#菜单动态合并 z

    在程序中经常使用弹出菜单,并且一个窗体中可以存在多个弹出菜单。开发过MDI窗体的读者可能都知道,当MDI子窗体最大化时,子窗体和主窗体的菜单能够自动的合并。这是如何实现的呢?本例实…

    技术杂谈 2023年6月1日
    089
  • Docker基本命令

    注意:删除镜像,正&amp…

    技术杂谈 2023年6月21日
    093
  • Docker快速部署clickhouse

    Docker快速部署clickhouse Clickhouse特点 完备的DBMS:不仅是个数据库,也是个数据库系统 列存储和数据压缩:典型的olap数据库特性 向量化并行:利用C…

    技术杂谈 2023年6月21日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球