文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试官:说说你对 TypeScript 中类的理解?应用场景?

2024-12-14 00:48

关注

本文转载自微信公众号「JS每日一题」,作者灰灰。转载本文请联系JS每日一题公众号。

 

一、是什么

类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础

类是一种用户定义的引用数据类型,也称类类型

传统的面向对象语言基本都是基于类的,JavaScript 基于原型的方式让开发者多了很多理解成本

在 ES6 之后,JavaScript 拥有了 class 关键字,虽然本质依然是构造函数,但是使用起来已经方便了许多

但是JavaScript 的class依然有一些特性还没有加入,比如修饰符和抽象类

TypeScript 的 class 支持面向对象的所有特性,比如 类、接口等

二、使用方式

定义类的关键字为 class,后面紧跟类名,类可以包含以下几个模块(类的数据成员):

如下例子:

  1. class Car {  
  2.     // 字段  
  3.     engine:string;  
  4.   
  5.     // 构造函数  
  6.     constructor(engine:string) {  
  7.         this.engine = engine  
  8.     }   
  9.   
  10.     // 方法  
  11.     disp():void {  
  12.         console.log("发动机为 :   "+this.engine)  
  13.     }  

继承

类的继承使用过extends的关键字

  1. class Animal { 
  2.     move(distanceInMeters: number = 0) { 
  3.         console.log(`Animal moved ${distanceInMeters}m.`); 
  4.     } 
  5.  
  6. class Dog extends Animal { 
  7.     bark() { 
  8.         console.log('Woof! Woof!'); 
  9.     } 
  10.  
  11. const dog = new Dog(); 
  12. dog.bark(); 
  13. dog.move(10); 
  14. dog.bark(); 

Dog是一个 派生类,它派生自 Animal 基类,派生类通常被称作子类,基类通常被称作 超类

Dog类继承了Animal类,因此实例dog也能够使用Animal类move方法

同样,类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写,通过super关键字是对父类的直接引用,该关键字可以引用父类的属性和方法,如下:

  1. class PrinterClass {  
  2.    doPrint():void { 
  3.       console.log("父类的 doPrint() 方法。")  
  4.    }  
  5. }  
  6.   
  7. class StringPrinter extends PrinterClass {  
  8.    doPrint():void {  
  9.       super.doPrint() // 调用父类的函数 
  10.       console.log("子类的 doPrint()方法。"
  11.    }  

修饰符

可以看到,上述的形式跟ES6十分的相似,typescript在此基础上添加了三种修饰符:

私有修饰符

只能够在该类的内部进行访问,实例对象并不能够访问

并且继承该类的子类并不能访问,如下图所示:

受保护修饰符

跟私有修饰符很相似,实例对象同样不能访问受保护的属性,如下:

有一点不同的是 protected 成员在子类中仍然可以访问

除了上述修饰符之外,还有只读「修饰符」

只读修饰符

通过readonly关键字进行声明,只读属性必须在声明时或构造函数里被初始化,如下:

除了实例属性之外,同样存在静态属性

静态属性

这些属性存在于类本身上面而不是类的实例上,通过static进行定义,访问这些属性需要通过 类型.静态属性 的这种形式访问,如下所示:

  1. class Square { 
  2.     static width = '100px' 
  3.  
  4. console.log(Square.width) // 100px 

上述的类都能发现一个特点就是,都能够被实例化,在 typescript中,还存在一种抽象类

抽象类

抽象类做为其它派生类的基类使用,它们一般不会直接被实例化,不同于接口,抽象类可以包含成员的实现细节

abstract关键字是用于定义抽象类和在抽象类内部定义抽象方法,如下所示:

  1. abstract class Animal { 
  2.     abstract makeSound(): void; 
  3.     move(): void { 
  4.         console.log('roaming the earch...'); 
  5.     } 

这种类并不能被实例化,通常需要我们创建子类去继承,如下:

  1. class Cat extends Animal { 
  2.  
  3.     makeSound() { 
  4.         console.log('miao miao'
  5.     } 
  6.  
  7. const cat = new Cat() 
  8.  
  9. cat.makeSound() // miao miao 
  10. cat.move() // roaming the earch... 

三、应用场景

除了日常借助类的特性完成日常业务代码,还可以将类(class)也可以作为接口,尤其在 React 工程中是很常用的,如下:

export default class Carousel extends React.Component

由于组件需要传入 props 的类型 Props ,同时有需要设置默认 props 即 defaultProps,这时候更加适合使用class作为接口

先声明一个类,这个类包含组件 props 所需的类型和初始值:

  1. // props的类型 
  2. export default class Props { 
  3.   public children: Arrayany>> | React.ReactElement<any> | never[] = [] 
  4.   public speed: number = 500 
  5.   public height: number = 160 
  6.   public animation: string = 'easeInOutQuad' 
  7.   public isAuto: boolean = true 
  8.   public autoPlayInterval: number = 4500 
  9.   public afterChange: () => {} 
  10.   public beforeChange: () => {} 
  11.   public selesctedColor: string 
  12.   public showDots: boolean = true 

当我们需要传入 props 类型的时候直接将 Props 作为接口传入,此时 Props 的作用就是接口,而当需要我们设置defaultProps初始值的时候,我们只需要:

  1. public static defaultProps = new Props() 

Props 的实例就是 defaultProps 的初始值,这就是 class作为接口的实际应用,我们用一个 class 起到了接口和设置初始值两个作用,方便统一管理,减少了代码量

参考文献

https://www.tslang.cn/docs/handbook/classes.html

 

https://www.runoob.com/typescript/ts-class.html

 

来源:JS每日一题内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯