Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >被迫开始学习Typescript —— class

被迫开始学习Typescript —— class

作者头像
用户1174620
发布于 2022-05-18 03:04:46
发布于 2022-05-18 03:04:46
40600
代码可运行
举报
运行总次数:0
代码可运行

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

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

基本用法

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

  • 创建自己的对象基类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import type { InjectionKey } from 'vue'

  class BaseObject {
    $id: string | symbol | InjectionKey<string>
    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)
    }
  }
  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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 创建自己的数组类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class BaseArray extends Array  {
    $id: string | symbol | InjectionKey<string>
   
    constructor () {
      // 调用父类的 constructor()
      super()
      this.$id = 'array'
    }

    set $state(value: any) {
      this.length = 0
      if (Array.isArray(value)) {
        this.push(...value)
      } else {
        this.push(value)
      }
    }
  }
  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const _state2 = new BaseArray()
const state2 = reactive(_state2)

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

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

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

实现接口

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

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

  • 定义接口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  interface IState {
    $id: string | symbol | InjectionKey<string>
    set $state(value: any)
  }
  • 实现接口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class BaseObject implements IState {}

  class BaseArray extends Array implements IState {}

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

私有成员、只读成员

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

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

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

  • 修改一下接口,使用访问器(get)设置 $id
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  interface IState {
    get $id(): string | symbol | InjectionKey<string>
    set $state(value: any)
  }
  • 修改一下对象基类,使用 get 访问器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class BaseObject implements IState {
    get $id(): string | symbol | InjectionKey<string>}
  • 创建对象实例的函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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
  }
  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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])
  }
  • 效果
  • 分析

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

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

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

完整项目代码

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用户管理
生物信息分析平台可以同时提供给多个用户使用,如果想要使用服务器,必须以一个用户的身份登录,现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以多个用户同时使用,一般这些用户都是为普通用户,这些普通用户能同时登录这台计算机,计算机对这些用户分配一定的资源,普通用户在所分配到的资源内进行各自的操作。因为是多用户操作,就需要进行用户管理,包括用户的创建删除,分组管理,权限设置,资源分配等。Linux系统中引入 root 用户来进行管理。一个系统只有一个 root 账户,此用户是唯一的,拥有系统的所有权限。这个 root 用户我们也叫做超级用户。使用 root 账户一定要小心,拥有 root密码就意味着拥有了这台计算机上所有用户的所有数据。
生信喵实验柴
2022/10/25
1.2K0
用户管理
Linux下用户及用户权限管理
虽然很早就开始接触和使用Linux系列的系统,但是一直都是停留在使用层面,只能作为一个User,而并不是一个Developer,而要真正掌握Linux系列的系统,并以其作为开发环境进行开发,有很多知识是必须要了解的,就比如用户及用户权限管理。 用户和用户组文件 在linux中,用户帐号,用户密码,用户组信息和用户组密码均是存放在不同的配置文件中的。 在linux系统中,所创建的用户帐号和其相关信息(密码除外)均是存放在/etc/passwd配置文件中。由于所有用户对passwd文件均有读取的权限,因此
李郑
2018/03/01
6.8K0
快速学习Linux-权限管理
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/11/14
4630
Linux用户管理常用命令
以"root:x:0:0:root:/root:/bin/bash"这一行为例,以":"为分隔符,说明每一列的意义
CoderJed
2018/09/13
1.3K0
Linux用户管理
Linux用户管理是Linux系统管理员必须掌握的重要技能之一。它包括用户账号的创建、修改和删除,以及用户组的管理等。本文将详细介绍Linux用户管理的相关知识,并给出相应的示例。
玖叁叁
2023/04/08
3.2K0
Linux之用户管理基本指令
文章目录 1. 基本介绍 2. 添加用户 2.1 基本语法 2.2 应用案例 2.3 细节说明 3. 指定/修改 密码 3.1 基本语法 3.2 应用案例 4. 删除用户 4.1 基本语法 4.2 应用案例 4.3 细节说明 5. 查询用户信息指令 5.1 基本语法 5.2 应用实例 5.3 细节说明 6. 切换用户 6.1 介绍 6.2 基本语法 6.3 应用实例 6.4 细节说明 7. 查看当前用户/登录用户 7.1 基本语法 8. 用户组 8.1 介绍 8.2 新增组 8.3 删除组 8
兮动人
2021/06/11
4850
Linux之用户管理基本指令
Linux用户管理命令
Linux 系统的管理员之所以是 root,并不是因为名字叫 root,而是因为该用户的身份号码即 UID(User IDentification)的数值为 0。在 Linux 系统中 UID 就像我们的身份证号码一样具有唯一性,因此可通过用户的 UID 值来判断用户身份。在 RHEL 8 系统中,用户身份有下面这些。
张旭博客
2022/12/29
2.4K0
Linux用户管理命令
用户管理指令
(2)x: 口令,系统用口令来验证用户的合法性。现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。
以某
2023/03/07
1.3K0
linux实战(4)用户管理与组管理实战操作
#不创建主目录,不指定家目录,不生成家目录,之前是用 cd /home进入家目录后可以看到我们创建的XD用户,使用这个-M就是不会出现在家目录中的了。如在创建一个useradd -M 后面是默认的话会自动指定是/bin/bash是可登录的,而UID会在之前的基础上自动增加
大数据小禅
2021/08/16
1.1K0
linux实战(4)用户管理与组管理实战操作
linux(十二)之用户管理
前面学习了那么多关于linux的东西,相信大家都对linux应该 有一个大概的了解了。现在给大家分享的是linux中的用户管理,接下来让我们进入正题吧! 今天其实放松了一整天了,有点后悔自己没有把这些时间用来学习。给自己一句话:"good good study,day day up!  fighting" 一、linux的用户和用户组管理概述  Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 用户的账号一方面可
用户1195962
2018/01/18
1.1K0
linux(十二)之用户管理
趣谈Linux用户管理
没错就是他,Linux中最厉害的用户,没有之一,维护世界和平,维护系统治安可以对全部用户、全部目录、全部文件等等为所欲为的超级用户,英文名称root。
闫同学
2023/11/08
3460
Linux中用户管理常用的命令
用户管理主要包含对用户的添加、删除和属性修改,用户组的添加、删除,用户所属用户组的添加、删除和属性修改。
菲宇
2022/12/02
1.1K0
Linux基础之用户管理
在linux中,任何一个要使用系统资源的用户,都必须首先向系统管理员(root)申请一个账号,然后以这个账号的身份进入系统。
我被狗咬了
2019/09/23
7090
Linux基础之用户管理
Linux | 用户管理
Linux是一个多用户操作系统,任何一个想要使用系统资源的用户,必须先向管理员申请账号,再以申请的账号进入系统。因此账号类型又被分为一下 两类:
BreezeCloud
2022/10/04
6.9K0
Linux | 用户管理
Linux用户权限管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管 理员申请一个账号,然后以这个账号的身份进入系统。
星陨1357
2023/03/14
16.1K0
Linux用户权限管理
Linux 用户管理
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户9615083
2022/12/25
4.8K0
Linux 用户管理
Linux系统下的用户管理模式
linux是分时多用户操作系统。可以同时为几个、几十个甚至几百个用户服务。也就是同时可以有多个账号登录。一个linux终端可以登录多个用户,一个用户可以在多个Linux终端同时登录。
炒香菇的书呆子
2024/07/27
1950
Linux——用户管理
/etc/passwd 从文件名称看是存储密码相关的,但是这个已经是历史,心在主要存储的使用户名称
羊羽shine
2019/05/28
4K0
Linux学习(二)——用户和用户组管理
Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。
传说之下的花儿
2023/04/16
8310
Linux学习(二)——用户和用户组管理
Linux用户管理
这次来说一下 Linux的用户管理,因为 Linux不同于 windows,它是一个多用户、多任务的操作系统,即允许同时登录多个用户进行操作,所以在学习 Linux的过程中必然要学习用户管理方面的知识,当然,也无非是一些增删改查的操作。内容如下。
reload
2024/01/30
4120
Linux用户管理
相关推荐
用户管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档