第四篇 TypeScript 【 typeScript 接口 + typeScript 类 】

发布时间 2023-03-28 15:53:23作者: caix-1987

typeScript 接口 【 interface 】

1、在面向对象语言中,接口是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类去实现

2、TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述
对象的形状
interface Person {
  name: string;
  age: number;
}

let Semlinker: Person = {
  name: "Semlinker",
  age: 33,
};
可选 | 只读属性 ReadonlyArray
1、ReadonlyArray<T>  数组特有 去掉了所有可变方法 保证数据不被修改

2、Array<T> 数组特有

3、readonly name: string;

interface Person {
  readonly name: string;
  age?: number;
}

1、只读属性用于限制只能在对象刚刚创建的时候修改其值

2、TypeScript 还提供了 ReadonlyArray<T> 类型,它与 Array<T> 相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改

let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!

TypeScript 类

类的属性与方法
在面向对象语言中,类是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法

在 TypeScript 中,我们可以通过 Class 关键字来定义一个类

class Greeter {
  // 静态属性
  static cname: string = "Greeter";
  // 成员属性
  greeting: string;

  // 构造函数 - 执行初始化操作
  constructor(message: string) {
    this.greeting = message;
  }

  // 静态方法
  static getClassName() {
    return "Class name is Greeter";
  }

  // 成员方法
  greet() {
    return "Hello, " + this.greeting;
  }
}

let greeter = new Greeter("world");
成员属性 与 静态属性 、 成员方法 与 静态方法 有什么区别
以上代码编译生成的 ES5 代码

var Greeter = /** @class */ (function () {
    // 构造函数 - 执行初始化操作
    function Greeter(message) {
        this.greeting = message;
    }
    // 静态方法
    Greeter.getClassName = function () {
        return "Class name is Greeter";
    };
    // 成员方法
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    // 静态属性
    Greeter.cname = "Greeter";
    return Greeter;
}());
var greeter = new Greeter("world");
访问器
在 TypeScript 中,我们可以通过 getter 和 setter 方法来实现数据的封装和有效性校验,防止出现异常数据

let passcode = "Hello TypeScript";

class Employee {
  private _fullName: string;

  get fullName(): string {
    return this._fullName;
  }

  set fullName(newName: string) {
    if (passcode && passcode == "Hello TypeScript") {
      this._fullName = newName;
    } else {
      console.log("Error: Unauthorized update of employee!");
    }
  }
}

let employee = new Employee();
employee.fullName = "Semlinker";
if (employee.fullName) {
  console.log(employee.fullName);
}
类的继承
1、继承 (Inheritance) 是一种 联结类 与 类 的层次模型

2、继承 指的是一个类 【 称为子类、子接口 】 继承另外的一个类 【 称为父类、父接口 】 的功能,并可以增加它自己的新功能的能力,继承是 类与类 或者 接口与接口 之间最常见的关系

在 TypeScript 中,我们可以通过 extends 关键字来实现继承

class Animal {
  name: string;
  
  constructor(theName: string) {
    this.name = theName;
  }
  
  move(distanceInMeters: number = 0) {
    console.log(`${this.name} moved ${distanceInMeters}m.`);
  }
}

class Snake extends Animal {
  constructor(name: string) {
    super(name);
  }
  
  move(distanceInMeters = 5) {
    console.log("Slithering...");
    super.move(distanceInMeters);
  }
}

let sam = new Snake("Sammy the Python");
sam.move();
ECMAScript 私有字段
1、在 TypeScript 3.8 版本就开始支持ECMAScript 私有字段,使用方式如下

class Person {
  #name: string;

  constructor(name: string) {
    this.#name = name;
  }

  greet() {
    console.log(`Hello, my name is ${this.#name}!`);
  }
}

let semlinker = new Person("Semlinker");

semlinker.#name;

//     ~~~~~
// Property '#name' is not accessible outside class 'Person'
// because it has a private identifier

2、与常规属性 【 甚至使用 private 修饰符声明的属性 】不同,私有字段要牢记以下规则

   1、私有字段以 # 字符开头,有时我们称之为私有名称
   
   2、每个私有字段名称都唯一地限定于其包含的类
   
   3、不能在私有字段上使用 TypeScript 可访问性修饰符 【 如 public 或 private 】
   
   4、私有字段不能在包含的类之外访问,甚至不能被检测到