TypeScript 基础语法——类
面向对象编程(类)
构造函数参数属性
因为在构造函数中对类成员属性进行传参赋值初始化是一个比较常见的场景,所以 ts 提供了一个简化
操作:给构造函数参数添加修饰符来直接生成成员属性
public 就是类的默认修饰符,表示该成员可以在任何地方进行读写操作
class User{ constructor( public id: number, public username:string ){ // 可以省略初始化值 //this.id =id; //this,username = username } postArticle(title:string,text:string){ console.log(`${this.username} 发表了一篇 ${title}`) } } let users = new User(1,'xxx') users.postArticle('文章','内容') 复制代码
继承 extend
使用方法和JS一样,通过super关键字使用
在子类中,我们可以通过 super 来引用父类
如果子类没有重写构造函数,则会在默认的 constructor 中调用 super()
如果子类有自己的构造函数,则需要在子类构造函数中显示的调用父类构造函数 : super(//参
数) ,否则会报错
在子类构造函数中只有在 super(//参数) 之后才能访问 this
在子类中,可以通过 super 来访问父类的成员属性和方法
通过 super 访问父类的的同时,会自动绑定上下文对象为当前子类 this
方法的重写与重载
重写:参数类型个数一致,只修改方法里的内容 重载:参数类型个数不一致,和函数重载用法一致
修饰符
目前 TypeScript 提供了四种修饰符:
public:公有,默认 自身、子类、类外可以访问
protected:受保护 自身、字类可以访问
private:私有 自身
readonly:只读 自身、子类、类外可以访问
class User { constructor( // 可以访问,但是一旦确定不能修改 readonly id: number, // 可以访问,但是不能外部修改 protected username: string, // 外部包括子类不能访问,也不可修改 private password: string ) { // ... } // ... } let user1 = new User(1, 'xxx', '123456'); 复制代码
静态成员 static
前面我们说到的是成员属性和方法都是实例对象的,但是有的时候,我们需要给类本身添加成员,区分某成员是静态还是实例的:
该成员属性或方法是类型的特征还是实例化对象的特征
如果一个成员方法中没有使用或依赖 this ,那么该方法就是静态的
type IAllowFileTypeList = 'png'|'gif'|'jpg'|'jpeg'|'webp'; class User { // static 必须在 readonly 之前 static readonly ALLOW_FILE_TYPE_LIST: Array<IAllowFileTypeList> = ['png','gif','jpg','jpeg','webp']; constructor( id: number, username: string, private _allowFileTypes: Array<IAllowFileTypeList> ) { } info(): void { // 类的静态成员都是使用 类名.静态成员 来访问 console.log(User.ALLOW_FILE_TYPE_LIST);} 复制代码
类的静态成员是属于类的,所以不能通过实例对象(包括 this)来进行访问,而是直接通过类名访问(不管是类内还是类外)
静态成员也可以通过访问修饰符进行修饰
静态成员属性一般约定(非规定)全大写
抽象类
有的时候,一个基类(父类)的一些方法无法确定具体的行为,而是由继承的子类去实现,如果一个方法没有具体的实现方法,则可以通过 abstract 关键字进行修饰,使用抽象类有一个好处:约定了所有继承子类的所必须实现的方法,使类的设计更加的规范 使用注意事项
abstract 修饰的方法不能有方法体
如果一个类有抽象方法,那么该类也必须为抽象的
如果一个类是抽象的,那么就不能使用 new 进行实例化(因为抽象类表名该类有未实现的方法,所以不允许实例化)
如果一个子类继承了一个抽象类,那么该子类就必须实现抽象类中的所有抽象方法,否则该类还得声明为抽象的
作者:GW
链接:https://juejin.cn/post/7022838502836404260