TS 从 0 到 1 - 类

2023-05-17 19:57:17 浏览数 (1)

# 属性与方法

在面向对象语言中,类是创建对象的蓝图,描述了所创建的对象共同的属性和方法。

代码语言:javascript复制
class Greeter {
  // 静态属性
  static cname: string = 'Greeter';
  // 成员属性
  greeting: string;
  // 构造函数 - 执行初始化操作
  constructor(message: string) {
    this.greeting = message;
  }
  // 静态方法
  static getClassName() {
    return 'Class name is '   Greeter.cname;
  }
  // 成员方法
  greet() {
    return 'Hello, '   this.greeting;
  }
}

let greeter = new Greeter('Cell');

// "use strict";
// class Greeter {
//     // 构造函数 - 执行初始化操作
//     constructor(message) {
//         this.greeting = message;
//     }
//     // 静态方法
//     static getClassName() {
//         return 'Class name is '   Greeter.cname;
//     }
//     // 成员方法
//     greet() {
//         return 'Hello, '   this.greeting;
//     }
// }
// // 静态属性
// Greeter.cname = 'Greeter';
// let greeter = new Greeter('Cell');

# ES 私有字段

代码语言:javascript复制
class Greeter {
  #name: string;
  constructor(name: string) {
    this.#name = name;
  }
  greet() {
    return `Hello, my name is ${this.#name}.`;
  }
}

let greeter = new Greeter('Cell');

greet.#name; // Error - 私有字段只能在类内部访问

私有字段的一些规则:

  • 私有字段以 # 开头
  • 每个私有字段名称都唯一地限定于其包含的类
  • 不能在私有字段上使用 TypeScript 访问修饰符(publicprivate
  • 私有字段不能在包含的类之外访问,甚至不能被检测到

# 访问器

通过 gettersetter 方法来实现数据的封装和有效性校验,防止出现异常数据。

代码语言:javascript复制
let password = "Cellinlab";

class Employee {
  private _fullName: string = '';

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

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

let employee = new Employee();
employee.fullName = "Cell";

if (employee.fullName) {
  console.log(employee.fullName);
}

# 继承

继承是一种联结类与类的层次模型。指一个类(子类、子接口)继承另一个类(父类、父接口)的属性和方法,并可以增加自己的属性和方法。

代码语言:javascript复制
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);
  }
}

class Horse extends Animal {
  constructor(name: string) {
    super(name);
  }

  move(distanceInMeters = 45) {
    console.log("Galloping...");
    super.move(distanceInMeters);
  }
}

let s = new Snake("sss");
s.move(); // Slithering... sss moved 5m.

let h = new Horse("hhh");
h.move(34); // Galloping... hhh moved 34m.

# 抽象类

抽象类不能被实例化,因为它里面包含一个或多个抽象方法(抽象方法指没有具体实现的方法)。

代码语言:javascript复制
abstract class Person {
  constructor(public name: string) {}
  abstract say(words: string): void;
}

const p = new Person('Cell'); // Error: Cannot create an instance of an abstract class.

只能实例化实现了所有抽象方法的子类。

代码语言:javascript复制
abstract class Person {
  constructor(public name: string) {}
  abstract say(words: string): void;
}

class Developer extends Person {
  constructor(name: string) {
    super(name);
  }
  say(words: string): void {
    console.log(`${this.name} say: ${words}`);
  }
}

const p = new Developer('Cell');
p.say('Hello, TypeScript!'); // Cell say: Hello, TypeScript!

# 类方法重载

代码语言:javascript复制
class ProductService {
  getProducts(): void;
  getProducts(id: number): void;
  getProducts(id?: number): void {
    if (typeof id === 'number') {
      console.log(`Get product by id: ${id}`);
    } else {
      console.log('Get all products');
    }
  }
}

const productService = new ProductService();
productService.getProducts(); // Get all products
productService.getProducts(1); // Get product by id: 1

0 人点赞