当前位置: 首页 > 科技观察

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

时间:2023-03-19 02:08:57 科技观察

本文转载自微信公众号《JS日报》,作者慧慧。转载本文请联系JS每日一问公众号。1、什么是类(Class)是面向对象程序设计(OOP,Object-OrientedProgramming)实现信息封装的基础类?它是一种用户定义的引用数据类型,也称为类类型。传统的面向对象语言基本都是以类为基础的,而JavaScript的基于原型的方式让开发者理解的多了很多。在ES6之后,JavaScript有了class关键字。虽然本质还是构造器,使用起来方便很多,但是JavaScript的类还是有一些特点的。不加,比如修饰符和抽象类TypeScript的类支持所有面向对象的特性,比如类,接口等。2.定义类的关键字是class,后面是类名。一个类可以包含以下模块(类的数据成员):“字段”:字段是在类中声明的变量。字段表示有关对象的数据。“构造函数”:类实例化时调用,可以为类的对象分配内存。"Method":方法是对象要执行的操作如下:void{console.log("Theengineis:"+this.engine)}}继承类的继承使用了关键字extendsclassAnimal{move(distanceInMeters:number=0){console.log(`Animalmoved${distanceInMeters}m.`);}}classDogextendsAnimal{bark(){console.log('Woof!Woof!');}}constdog=newDog();dog.bark();dog.move(10);dog.bark();Dog是一个派生类,它派生自Animal基类。派生类通常称为子类,基类通常称为超类。Dog类继承了Animal类,所以实例dog也可以使用Animal类的move方法。同样,类被继承后,子类可以重新定义父类的方法。这个过程称为方法重写。super关键字是对父类的直接引用。该关键字可以引用父类的属性和方法,如下:void{super.doPrint()//调用父类的函数console.log("子类的doPrint()方法。")}}修饰符可以看到,上面的形式和ES6很像,typescript在此基础上增加了三个修饰符:publicpublic:类程序中定义的成员可以自由访问privateprivate:只能在内部访问该类的protected:除了在本类内部可以访问外,在子类中仍然可以访问,private修饰符只能在本类内部访问,不能访问实例对象,继承本类的子类也不能访问,如下图所示:protected修饰符与private修饰符非常相似,实例对象不能访问protected属性,如下:一个区别是protected成员在子类中仍然可以访问除了以上修饰符,还有只读的“修饰符”,只读修饰符是通过readonly关键字声明的,只读属性必须在声明的时候或者在const中初始化ructor,如下:除了实例属性,还有静态属性Staticattributes这些属性存在于类本身,而不是类的实例上。它们是通过静态定义的,访问这些属性需要通过类型来访问。这种形式的静态属性访问方式如下:classSquare{staticwidth='100px'}console.log(Square.width)//100px可以发现上面类的一个特点就是它们都可以被实例化。在typescript中,还有一个抽象类abstractclass抽象类作为其他派生类的基类,它们一般不直接实例化。与接口不同,抽象类可以包含成员的实现细节。abstract关键字用于定义抽象类,在抽象类内部定义抽象方法,如下:abstractclassAnimal{abstractmakeSound():void;move():void{console.log('roamingtheearch...');}}这种类的不能实例化,通常我们需要创建一个子类来继承,如下:()//roamingtheearch...3.应用场景除了利用类的特性完成日常业务代码外,还可以利用类(class)作为接口,尤其是在React项目中,如下:导出默认classCarouselextendsReact.Component因为组件需要传入props类型的Props,而且需要设置默认的props,即defaultProps,这时候用class作为接口先声明一个class比较合适,其中包含组件props所需的类型和初始值://propsoftypeexportdefaultclassProps{publicchildren:Array>|React.ReactElement|never[]=[]publicspeed:number=500publicheight:number=160publicanimation:string='easeInOutQuad'publicisAuto:boolean=truepublicautoPlayInterval:number=4500publicafterChange:()=>{}publicbeforeChange:()=>{}publicselesctedColor:stringpublicshowDots:boolean=true}当我们需要传入props类型,我们直接将Props作为接口传入,此时Props接口的作用就是接口,而当我们需要设置defaultProps的初始值时,我们只需要:publicstaticdefaultProps=newProps()Props的实例是初始值defaultProps,这个是class作为接口的实际应用,我们用一个class来打接口和设置初始值,方便统一管理,减少代码量参考https://www.tslang.cn/文档/手册/classes.htmlhttps://www.runoob.com/typescript/ts-class。网页格式