4. TypeScript 类

2023-10-28

TypeScript 类

1. TS中定义类

class Pointer{
  x!:number; // 实例上的属性必须先声明
  y!:number;
  constructor(x:number,y?:number,...args:number[]){
      this.x = x;
      this.y = y as number;
  }
}
let p = new Pointer(100,200);
// 实例上的属性需要先声明在使用,构造函数中的参数可以使用可选参数和剩余参数
console.log('1. TS中定义类', p)

2. 类中的修饰符

public修饰符(谁都可以访问到)

// public修饰符(谁都可以访问到)
class Animal {
  public name!: string; // 不写public默认也是公开的
  public age!: number;
  constructor(name: string, age: number) {
      this.name = name;
      this.age = age;
  }
}
class Cat extends Animal {
  constructor(name: string, age: number) {
      super(name, age);
      console.log('子类访问', this.name,this.age); // 子类访问
  }
}
let p2 = new Cat('Tom', 18);
console.log('外层访问', p2, p2.name, p2.age); // 外层访问

// 我们可以通过参数属性来简化父类中的代码
class Animal2 {
  constructor(public name: string, public age: number) {
      this.name = name;
      this.age = age;
  }
}

protected(受保护的) 修饰符 (自己和子类可以访问到)

// protected(受保护的) 修饰符 (自己和子类可以访问到)
class Animal3 {
  constructor(protected name: string, protected age: number) {
      this.name = name;
      this.age = age;
  }
}
class Cat3 extends Animal3 {
  constructor(name: string, age: number) {
      super(name, age);
      console.log('protected 子类访问', this.name, this.age)
  }
}
let p3 = new Cat3('Tom', 18);
// console.log('protected 外层访问', p3.name, p3.age); // error 不让打包 无法访问

private(私有的) 修饰符 (除了自己都访问不到)

// private(私有的) 修饰符 (除了自己都访问不到)
class Animal4 {
  constructor(private name: string, private age: number) {
      this.name = name;
      this.age = age;
  }
}
class Cat4 extends Animal4 {
  constructor(name: string, age: number) {
      super(name, age);
      // console.log(this.name, this.age); // 无法访问 (error 不让打包)
  }
}
let p4 = new Cat4('Tom', 18); 
// console.log(p4.name, p4.age);// 无法访问 (error 不让打包)

readonly修饰符 (仅读修饰符)

// readonly修饰符 (仅读修饰符)
class Animal5 {
  constructor(public readonly name: string, public age: number) {
      this.name = name;
      this.age = age;
  }
  changeName(name:string){
      // this.name = name; // 仅读属性只能在constructor中被赋值 (error 不让打包)
  }
}
class Cat5 extends Animal5 {
  constructor(name: string, age: number) {
      super(name, age);
  }
}
let p5 = new Cat5('Tom', 18); 
p5.changeName('Jerry');

3. 静态属性和方法

class Animal6 {
  static type = '哺乳动物'; // 静态属性
  static getName() { // 静态方法
      return '动物类';
  }
  private _name: string = 'Tom';

  get name() { // 属性访问器
      return this._name;
  }
  set name(name: string) {
      this._name = name;
  }
}
let animal = new Animal6();
console.log('间接获取私有变量', animal.name); // 间接获取私有变量
// 静态属性和静态方法是可以被子类所继承的

4.Super属性

class Animal7 {
  say(message:string){
      console.log(message);
  } 
  static getType(){
      return '动物'
  }
}
class Cat7 extends Animal7 {
  say(){ // 原型方法中的super指代的是父类的原型
      super.say('猫猫~');
  }
  static getType(){ // 静态方法中的super指代的是父类
      return super.getType()
  }
}
let cat = new Cat7();
console.log(Cat7.getType())

5. 类的装饰器

// 装饰类
function addSay(target:any){
  target.prototype.say = function(){console.log('say')}
}
// 装饰类可以给类扩展功能,需要 tsconfig.json 开启 experimentalDecorators:true
@addSay
class Person { // 装饰器其实就是高阶函数 把 Person 当作参数传递给 addSay
  say!:Function
}
let person = new Person
person.say();

装饰类中属性

// 装饰类中属性
function toUpperCase(target:any, key:string){
  let value = target[key]; 
  Object.defineProperty(target,key,{
      get(){
          return value.toUpperCase();
      },
      set(newValue){
          value = newValue
      }
  })
}
function double(target: any, key: string) {
  let value = target[key];
  Object.defineProperty(target, key, {
      get() {
          return value * 2;
      },
      set(newValue) {value = newValue}
  })
}
class Person2 {
  @toUpperCase
  name: string = 'xiaomi' // 装饰器可以装饰属性
  @double
  static age: number = 10;
  getName() {
      return this.name;
  }
}
let person2 = new Person2();
console.log("装饰类中属性", person2.getName(),Person2.age)
// 装饰属性可以对属性的内容进行改写,装饰的是实例属性则target指向类的原型、装饰的是静态属性则 target 执行类本身~

装饰类中方法

// 装饰类中方法
function noEnum(target:any,key:string,descriptor:PropertyDescriptor){
  console.log(descriptor)
  descriptor.enumerable = false;
}
class Person3 {
  @toUpperCase
  name: string = 'xiaomi'
  @double
  static age: number = 10;
  @noEnum
  getName() {
      return this.name;
  }
}
let person3 = new Person3();
console.log("getName 不可枚举", person3); // getName 不可枚举

装饰参数

// 装饰参数
function addPrefix(target:any,key:string,paramIndex:number){
  console.log(target,key,paramIndex); // Person.prototype getName  0 
}
class Person4 {
  @toUpperCase
  name: string = 'xiaomi'
  @double
  static age: number = 10;
  prefix!:string
  @noEnum
  getName(@addPrefix prefix:string) { // 给参数添加装饰器
      return this.name;
  }
}

6. abstract 抽象类

// 抽象类无法被实例化,只能被继承,抽象方法不能在抽象类中实现,只能在抽象类的具体子类中实现,而且必须实现。
abstract class Animal8 {
  name!:string;
  abstract speak():void // 定义类型时void表示函数的返回值为空(不关心返回值类型,所有在定义函数时也不关心函数返回值类型)
}
class Cat8 extends Animal8 {
  speak(){
    console.log('猫猫~');
  }
}
class Dog8 extends Animal8 {
  speak():string {
    console.log('汪汪~');
    return 'wangwang'
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4. TypeScript 类 的相关文章

随机推荐

  • 蓝桥杯评分标准_蓝桥杯比赛要求

    七 奖项设置及评选办法 7 1 省赛 1 参赛选手奖 省赛每个组别设置一 二 三等奖 比例分别为 10 20 30 总比例为实际参赛人数 的 60 零分卷不得奖 省赛一等奖选手获得直接进入全国总决赛资格 所有获奖选手均 可获得由工业和信息化
  • ABA问题及解决

    ABA问hiyi题 在多线程环境下 一个线程需要修改共享变量的值 使用CAS操作时 当其他线程将该共享变量由A该为B 再将B改为A后 这个线程依然可以CAS操作成功 因为这个线程不能感知这个共享变量被修改过 解决方法 给共享变量增加一个版本
  • spring cloud gateway项目启动报错

    spring cloud gateway项目启动报错 Correct the classpath of your application so that it contains a single compatible version of
  • Nginx之keepalive配置解读

    目录 keepalive基础介绍 Nginx中的keepalive配置项 应用场景 什么时候使用 什么时候不用 keepalive基础介绍 keepalive是HTTP 1 1协议中的一个特性 它允许客户端和服务器之间的TCP连接在一个HT
  • 使用file.transferTo(tempFile)保存文件,第二次操作时却报错:请求的操作无法在使用用户映射区域打开的文件上执行。

    背景是我要做个后台管理上表格的导入导出excel的功能 导出没有什么问题 但一到导入就开始出了问题 我用的是xxl excel工具 在导入时接收一个MultipartFile file 然后new一个新文件 再利用file transfer
  • 8-js高级-3

    JavaScript 进阶 3 了解构造函数原型对象的语法特征 掌握 JavaScript 中面向对象编程的实现方式 基于面向对象编程思想实现 DOM 操作的封装 编程思想 构造函数 原型 综合案例 编程思想 学习 JavaScript 中
  • pclint入门

    1 安装 将压缩包比如pclint8 zip拷贝到c 解压后重命名目录为c pclint 版本 Q 如何查看版本 A 见readme txt PC lint for C C Version 8 00e 2 开始使用 2 1 不用任何配置 直
  • 第十二章:使用C语言(Python语言)操作Sqlserver2019数据库

    目录 一 连接数据库的准备工作 二 使用 ODBC 连接数据库 1 ODBC 数据源简介 2 配置 ODBC 数据库源 3 连接数据库函数 4 C 语言通过 ODBC 操作数据库 三 非 ODBC 方式操作数据库 3 1 删除 修改 插入数
  • java 僵尸进程_僵尸进程ZOMBIE

    僵尸进程是指它的父进程已经退出 父进程没有等待 调用wait waitpid 它 而该进程dead之后没有进程接受 就成为僵尸进程 也就是 zombie 进程 一个进程在调用exit命令结束自己的生命的时候 其实它并没有真正的被销毁 而是留
  • 梦幻服务器系统维护后多久再登录,梦幻西游:系统维护后出现重大漏洞,官方发文紧急停机修复?...

    原标题 梦幻西游 系统维护后出现重大漏洞 官方发文紧急停机修复 精彩游戏 快乐无穷无尽 这里是梦幻西游资讯集中营 每天为你分享不一样的游戏乐趣 大家好 我是梦幻小九 当今社会网络游戏成千上万个 相信每一款网络游戏都会偶尔出现系统漏洞 梦幻西
  • 西门子PLC300系列与上位机无法建立以太网通信问题

    问题描述 最近做一个Java开发的WCS项目需要对接机械臂 使用的是PLC313型号 按照之前和其他型号PLC例如1200系列或者1500系列对接的经验配置好相关IP DB块以及数据结构偏移量以后发现无法建立连接 刚开始以为是使用是git上
  • keil编译运行错误,缺少error:#5:#includecore_cm3.h_过路老熊_新浪博客

    keil编译运行错误 提示缺少某个文件等等 如缺少error 5 include core cm3 h 用Keil vision5编译时出现以下错误 error 5 cannot open source input file core cm
  • Java EE 企业级应用 复习 初识Spring框架

    Spring概述 Spring是由Rod Johnson组织开发的一个分层的Java SE EE一站式轻量级开源框架 它最核心的理念是控制反转和面向切面编程 Spring框架的优点 非倾入式设计 降低耦合性 方便开发 支持AOP编程 支持声
  • Linux之Centos7.6版本下载及安装Go语言环境配置,安装Go1.18版本教程笔记-2023版

    文章目录 一 Linux下安装Go环境 1 远程获取 2 解压 3 添加环境变量 5 Go环境配置图 配置完成信息图 二 VsCode连接我们Go 2 1安装对应的插件 2 2进行连接 3 相关配置 4 成功连接 一 Linux下安装Go环
  • 视频在H5页面在微信浏览器不能自动播放问题

    引用官方的JS文件 正式方法 function BGMAutoPlayMgr url this audioContext new window AudioContext window webkitAudioContext window mo
  • 2020那些搭载Imagination IP的设备(国内篇)

    除海外市场外 2020年国内不少智能新品上市 并通过搭载ImaginationGPU 和 NNA IP 实现了更加明显的市场差异化 基于紫光展锐虎贲T7510 平台国内多款 5G 手机上市 智能手机市场 5G AI 无疑成为下一代手机的焦点
  • Unity调用Android类方法

    1 添加Unity的classes jar文件 创建一个Android工程AndroidUnityDemo 由于Unity的版本不同 直接在Unity安装包文件夹里面搜索classes jar文件 如果有多个classes jar文件 一般
  • SpringData JPA 提示:TransactionRequiredException: Executing an update/delete query

    问题场景 package com zzg dao import javax transaction Transactional import org springframework data jpa repository JpaReposi
  • [MySQL]实训七

    实训目的 设置字段的默认值约束 设置字段的自动增长约束 设置字段的外键约束 有关上述三种约束的概念在上一篇文章中有提及 http t csdn cn 9rV9T 1 在数据库db school中重新定义表tb student 要求以表级完整
  • 4. TypeScript 类

    TypeScript 类 1 TS中定义类 class Pointer x number 实例上的属性必须先声明 y number constructor x number y number args number this x x thi