美文网首页
TypeScript面向对象编程

TypeScript面向对象编程

作者: 杨志聪 | 来源:发表于2023-10-05 11:37 被阅读0次

    面向对象编程是编程风格的一种,以对象为基本材料来构建应用程序。对象可以包含数据(属性)和逻辑(方法)。

    类和对象

    类是创建对象的蓝图。

    class Account {
      id: number;
      // 构造方法(constructor)是一个类里面的一个特殊的方法
      // 构造方法会在创建一个实例时被调用
      // 我们在构造方法中初始化属性
      constructor(id: number) { 
          this.id = id;
      }
     }
    
    let account = new Account(1);
    

    访问控制修饰符(Access Modifiers)

    有三种访问控制修饰符:public, private和protected。public是默认的修饰符。private和protected的成员都不能被外部访问,但是protected的成员可以被继承,private的成员不能被继承。一般很少会用protected,除非你真的很清楚你要做什么。

    class Account {
      // protected的属性可以被继承
      // private的属性不能被继承
      private _balance: number;
      protected _taxRate: number;
    }
    

    可选属性和只读属性

    class Account {
        // 只读属性
        readonly id: number;
        // 可选属性
        nickname?: string;
        constructor(id: number) {
            this.id = id;
        }
    }
    

    参数属性(Parameter Properties)

    参数属性(Parameter Properties)允许将构造函数参数直接声明为类的属性。这种语法糖减少了代码的冗余,使得代码更加简洁和清晰。

    class Account {
      constructor(public id: number, private _balance: number) {}
    }
    
    let a = new Account(1, 100);
    console.log(a.id);
    

    getter和setter

    getter和setter特性允许我们在读取或者写入属性时,有机会做一些逻辑判断。

    class Account {
      constructor(private _balance: number) {}
      get balance() {
        return this._balance;
      }
      set balance(balance: number) {
        if (balance < 0) throw "Invalid balance!";
        this._balance = balance;
      }
    }
    
    let a = new Account(100);
    a.balance = -1;
    

    索引签名(Index Signatures)

    通过索引签名(Index Signatures)可以动态地为一个对象添加属性,同时可以保证类型安全:

    class SeatAssignment {
      [seatNumber: string]: string;
    }
    let seats = new SeatAssignment();
    seats.A1 = "Mary";
    seats.A2 = "John";
    

    静态方法和属性

    class Account {
        static count = 0;
        static foo() {
        }
    }
    
    Account.count++;
    Account.foo();
    

    继承

    class Student extends Person {
    }
    

    方法重写(Method Overriding)

    class Student extends Person {
      override speak() {
        console.log("Student speaking");
      }
    }
    

    抽象类和抽象方法

    抽象类,是“不完整”的类。抽象类不能用来实例化对象,需要被继承,在子类中完成完整的类,才能用来实例化对象。

    abstract class Shape {
      // 抽象方法不需要写函数体,而且用分号结尾
      abstract render();
    }
    class Circle extends Shape {
      override render() {
        console.log("Rendering a circle");
      }
    }
    

    接口(interface)

    我们用接口来定义一个对象的形状。

    interface Calendar {
      name: string;
      addEvent(): void;
    }
    class GoogleCalendar implements Calendar {
        constructor(public name: string) {}
        addEvent(): void {
            
        }
    }
    

    Interface VS Type

    在TypeScript中,interface和type可以互换使用。

    它们都能描述一个对象的形状。

    使用type:

    type Person = {
      name: string;
    };
    let tom: Person = { name: "tom" };
    

    使用interface:

    interface Person {
      name: string;
    }
    let tom: Person = { name: "tom" };
    

    它们都能被一个类实现。

    使用type:

    type Person = {
      name: string;
    };
    
    class Student implements Person {
      constructor(public name: string) {}
    }
    

    使用interface:

    interface Person {
      name: string;
    }
    
    class Student implements Person {
      constructor(public name: string) {}
    }
    

    相关文章

      网友评论

          本文标题:TypeScript面向对象编程

          本文链接:https://www.haomeiwen.com/subject/msyubdtx.html