声明

  1. class CustomStack {
  2. maxSize: number;
  3. size: number;
  4. stack: Array<number>;
  5. constructor(maxSize: number) {
  6. this.maxSize = maxSize;
  7. this.size = 0;
  8. this.stack = [];
  9. }
  10. }

对象

  1. const objArr: {name: sring}[] = [
  2. new Teacher(),
  3. {
  4. name: 'Jack'
  5. }
  6. ]

类型抽象

  1. // 类型别名
  2. type Person {
  3. name: String
  4. }
  5. // 类
  6. class Person {
  7. name: String
  8. }
  9. const teacher: Person = {
  10. name: "Jack"
  11. }

对象解构

  1. let person = {
  2. name: "Semlinker",
  3. gender: "Male",
  4. };
  5. let { name, gender } = person;

对象展开运算符

  1. let person = {
  2. name: "Semlinker",
  3. gender: "Male",
  4. address: "Xiamen",
  5. };
  6. // 组装对象
  7. let personWithAge = { ...person, age: 33 };
  8. // 获取除了某些项外的其它项
  9. let { name, ...rest } = person;

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

  1. class Person {
  2. name = 'Jack'
  3. getName() {
  4. return this.name;
  5. }
  6. }
  7. const person = new Person()
  8. person.getName()
  9. // 继承, 子类方法覆盖父类方法
  10. class Teacher extends Person {
  11. getTeacherName() {
  12. return 'teacher'
  13. }
  14. // getName() {
  15. // return 'Lee'
  16. // }
  17. // 继承父类方法
  18. getName() {
  19. return super.getName() + 'Lee'
  20. }
  21. }

属性:

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

  • 静态属性, static作为前缀
  • 成员属性

操作静态属性(如何读取和修改)

📢 更规范写法, 私有属性/方法用下划线开头

  1. class Person {
  2. constructor (private _name: string) {}
  3. get name() {
  4. return this._name
  5. }
  6. set name(name: string) {
  7. this._name = name
  8. }
  9. }
  10. const person = new Person('Jack')
  11. console.log(person.name) // Jack
  12. person.name = 'Lee'
  13. console.log(person.name) // Lee

静态属性应用: 实现单例模式

单例模式, 永远只生成一个实例
直接挂在类的下边, 定义私有静态属性存放事例, 从而限制再一次的构造。

  1. class Person {
  2. private static instance: Person;
  3. private constructor(name: string) {}
  4. static getInstance(name: string) {
  5. if (!this.intance) {
  6. new Person(name)
  7. }
  8. return this.instance
  9. }
  10. }
  11. const p1 = Person.getInstance('Jack')
  12. const p2 = Person.getInstance('Lee')
  13. console.log(p1.name) // Jack
  14. console.log(p2.name) // Lee

readonly 修饰器

  1. class Person() {
  2. public readonly name: string;
  3. constructor(name: string) {
  4. this.name = name;
  5. }
  6. }

方法:

  • 静态方法
  • 成员方法

    成员属性 VS 静态属性区别❓

    ```typescript 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”);

  1. 编译后的 ES5 代码:
  2. ```typescript
  3. "use strict";
  4. var Greeter = /** @class */ (function () {
  5. // 构造函数 - 执行初始化操作
  6. function Greeter(message) {
  7. this.greeting = message;
  8. }
  9. // 静态方法
  10. Greeter.getClassName = function () {
  11. return "Class name is Greeter";
  12. };
  13. // 成员方法
  14. Greeter.prototype.greet = function () {
  15. return "Hello, " + this.greeting;
  16. };
  17. // 静态属性
  18. Greeter.cname = "Greeter";
  19. return Greeter;
  20. }());
  21. var greeter = new Greeter("world");

访问类型

  • private (私有属性), 允许内部调用
  • public (公共属性),允许在类内外调用
  • protected , 允许类内及继承子类调用 ```typescript class Employee { private _fullName: string = ‘Jack’; }

var a = new Employee();

// 非法外部调用报error console.log(a._fullName); // error TS2341: Property ‘_fullName’ is private and only accessible within class ‘Employee’.

  1. <a name="iVl8s"></a>
  2. ### 访问器
  3. 通过 `getter` 和 `setter` 方法来实现数据的封装和有效性校验,防止出现异常数据。<br />set、get作为函数前缀, 调用get函数, 后无需 '()'。
  4. ```typescript
  5. let passcode = "Hello TypeScript";
  6. class Employee {
  7. private _fullName: string;
  8. get fullName(): string {
  9. return this._fullName;
  10. }
  11. set fullName(newName: string) {
  12. if (passcode && passcode == "Hello TypeScript") {
  13. this._fullName = newName;
  14. } else {
  15. console.log("Error: Unauthorized update of employee!");
  16. }
  17. }
  18. }
  19. let employee = new Employee();
  20. employee.fullName = "Semlinker";
  21. if (employee.fullName) {
  22. console.log(employee.fullName);
  23. }

构造器

传统写法:

  1. class Person {
  2. public name: string;
  3. constructor(name: string) {
  4. this.name = name;
  5. }
  6. }
  7. const p = new Person('Jack');
  8. console.log(p.name);
  9. // Jack

简化语法: 直接在构造器传参中定义public, 减少操作

  1. class Person {
  2. constructor(public name: string) { }
  3. }

子类构造器, 需要子类内部super调父类构造器

  1. class Person {
  2. constructor(public name: string) {
  3. }
  4. }
  5. class Teacher extends Person {
  6. constructor(public age: number) {
  7. super('Lucy');
  8. }
  9. }
  10. let t = new Teacher(36);
  11. console.log(t.name, t.age);
  12. // Lucy 36


类的继承

继承 (Inheritance) 是一种联结类与类的层次模型。指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系。
继承是一种 is-a 关系:
TypeScript5-类 - 图1
在 TypeScript 中,我们可以通过 extends 关键字来实现继承:

  1. class Animal {
  2. name: string;
  3. constructor(theName: string) {
  4. this.name = theName;
  5. }
  6. move(distanceInMeters: number = 0) {
  7. console.log(`${this.name} moved ${distanceInMeters}m.`);
  8. }
  9. }
  10. class Snake extends Animal {
  11. constructor(name: string) {
  12. super(name);
  13. }
  14. move(distanceInMeters = 5) {
  15. console.log("Slithering...");
  16. super.move(distanceInMeters);
  17. }
  18. }
  19. let sam = new Snake("Sammy the Python");
  20. sam.move();

ECMAScript 私有字段

在 TypeScript 3.8 版本就开始支持ECMAScript 私有字段,使用方式如下:

  1. class Person {
  2. #name: string;
  3. constructor(name: string) {
  4. this.#name = name;
  5. }
  6. greet() {
  7. console.log(`Hello, my name is ${this.#name}!`);
  8. }
  9. }
  10. let semlinker = new Person("Semlinker");
  11. semlinker.#name;
  12. // ~~~~~
  13. // Property '#name' is not accessible outside class 'Person'
  14. // because it has a private identifier.

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

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

抽象类

抽象类, 只能被继承, 不能被new调用构造函数。

  1. // 抽象类
  2. abstract class Geom {
  3. constructor (public width: number) {}
  4. getType() {
  5. return 'Gemo';
  6. }
  7. // 抽象方法
  8. abstract getArea(): number;
  9. }
  10. class Circle extends Geom {
  11. getArea() {
  12. return 123;
  13. }
  14. }
  15. class Square extends Geom {}
  16. class Triangle extends Geom {}