Loading [MathJax]/jax/output/CommonHTML/config.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,会发现拥有相同的成员:id 和 state。那么要不要约束一下?

如果想要实现约束功能的话,可以定义一个 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
被迫开始学习Typescript —— interface
一开始以为,需要使用 class 来定义呢,学习之后才发现,一般都是使用 interface 来定义的。
用户1174620
2022/05/15
3030
TypeScript
TypeScript中的Object类型并不单指普通的对象类型,而是泛指非原始类型,也就是对象,数组和函数
conanma
2021/10/28
1.8K0
TypeScript 学习笔记(一)
TypeScript 是 JavaScript 的一个超集,主要提供了 类型系统 和对 ES6 的支持,由 Microsoft 开发。 目前应用:vue3.0,angular2.0,vscode, react ....
前端老鸟
2020/05/18
2.8K0
一份不可多得的TypeScript系统入门整理
函数声明(Function Declaration)和函数表达式(Function Expression)
@超人
2021/07/29
1.8K0
一份不可多得的TypeScript系统入门整理
你应该知道的TypeScript高级概念
来源 | https://juejin.cn/post/6897779423858737166
winty
2020/12/07
5230
TypeScript入门
JavaScript 中可以用 Number 表示的最大整数为 2^53 - 1,可以写为 Number.MAX_SAFE_INTEGER。如果超过了这个界限,可以用 BigInt来表示,它可以表示任意大的整数。
江拥羡橙
2024/10/06
890
TypeScript入门
前端应该掌握的Typescript基础知识
js 是一门动态弱类型语言, 我门可以随意的给变量赋不同类型的值 ts 是拥有类型检查系统的 javascript 超集, 提供了对 es6 的支持, 可以编译成纯 javascript,运行在任何浏览器上。 TypeScript 编译工具可以运行在任何服务器和任何系统上。TypeScript 是开源的。
前端老鸟
2022/03/07
6540
TypeScript学习笔记(四)—— TypeScript提高
Type又叫类型别名(type alias),作用是给一个类型起一个新名字,不仅支持interface定义的对象结构,还支持基本类型、联合类型、交叉类型、元组等任何你需要手写的类型。
张果
2022/10/04
2.5K0
TypeScript学习笔记(四)—— TypeScript提高
TypeScript 快速入门
由于这种强弱类型之分根本不是某一个权威机构的定义,一般描述强类型有更强的类型约束,而弱类型中几乎没有什么约束。
用户3045442
2020/08/06
1.6K0
TypeScript 快速入门
TypeScript基础知识
TypeScript是JavaScript的一个超集,支持ECMAScript6标准。
岳泽以
2022/11/22
2.3K0
TypeScript基础知识
TypeScript一些知识点
TypeScript 可以添加区域注释,可以让VS Code等编辑器识别为一个代码区域,区域注释使用的是单行注释语法:
kai666666
2024/07/11
1610
typeScript的基础认识
世间万物皆对象
2024/03/20
1290
typeScript学习总结(一)
最近在学习typeScript,因为公司估计需要使用。同样是学习笔记,写文章的意图就在于复习总结一下之前的学习,顺带着积累写文章的感觉,在这个人人都是自媒体的时代,也能不被落的太远。
张宗伟 plus
2022/10/28
7570
typeScript学习总结(一)
深入浅出 TypeScript
本文是阅读小册 「《深入浅出 TypeScript》」 的阅读笔记,对TypeScript感兴趣的同学请继续阅读吧。
chuckQu
2022/08/19
2.9K0
了不起的 TypeScript 入门教程
想学习 TypeScript 的小伙伴看过来,本文将带你一步步学习 TypeScript 入门相关的十四个知识点,详细的内容大纲请看下图:
阿宝哥
2020/06/10
7.1K0
Vue3开发最佳实践和实用技巧(上)
上面我们发现 number 类型竟然书写了两次,我们可以单独抽离成一个类型方便复用
PHP开发工程师
2022/08/20
1.5K0
Typescript真香秘笈
本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 1. 前言 2018年Stack Overflow Developer的调研(https://insights.stackoverflow.com/survey/2018/)显示,TypeScript已经成为比JavaScript更受开发者喜爱的编程语言了。 之前我其实对于typescript没有太多好感,主要是认为其学习成本比较高,写起代码来还要多写很多类型声明,并且会受到静态类型检查
用户1097444
2022/06/29
5.8K0
Typescript真香秘笈
可能是你需要的 React + TypeScript 50 条规范和经验
下列关键字后必须有大括号(即使代码块的内容只有一行):if, else, for, while, do, switch, try, catch, finally, with。
夜尽天明
2019/06/17
2.7K0
一起重学TypeScript
class 类名<T> { name!: T; hobby!: T; } # 这样这个类的所有类型为 number let 实例 = new 类名<number>();
程序员海军
2021/10/10
2.1K0
一起重学TypeScript
Typescript 2+迷你书 :从入门到不放弃
众所周知:JS中有这么几种类型的数据: Symbol,boolean,Number,Object[Array在js中也属于对象],undefind,null,String;
CRPER
2018/08/28
8830
相关推荐
被迫开始学习Typescript —— interface
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验