返回

深入浅出:TypeScript 笔记(二)

前端

好的,这里有一篇关于 typescript 笔记(二)的文章。

TypeScript 作为一种强大的 JavaScript 超集,拥有诸多实用特性,在实际开发中大放异彩。本文将继续深入探究 TypeScript 中一些常用功能,如类型断言、类型保护、枚举、接口、类、访问修饰符、构造函数、继承、多态、抽象类等,帮助你更全面地掌握 TypeScript。

类型断言

类型断言,顾名思义,就是断言一个变量的类型。它允许你显式地指定一个变量的类型,即使该变量的实际类型与指定类型不匹配。类型断言可以通过两种方式实现:

  • 尖括号语法(<>):尖括号语法是最常用的类型断言方式。它通过在变量名后跟一个尖括号内的类型注解来实现。例如:
let str: string = "Hello TypeScript";
let num = <number> str; // 类型断言,将字符串转换为数字
console.log(num); // 输出结果:NaN
  • as as 是另一种类型断言方式。它通过在变量名后跟一个 as 关键字和一个类型注解来实现。例如:
let str: string = "Hello TypeScript";
let num = str as number; // 类型断言,将字符串转换为数字
console.log(num); // 输出结果:NaN

需要注意的是,类型断言并不会改变变量的实际类型,它只是在编译时告诉编译器你希望将该变量视为指定类型。因此,在使用类型断言时,需要确保你对变量的类型有足够的了解,否则可能会导致意料之外的结果。

类型保护

类型保护是指在运行时检查一个变量的类型并采取相应措施的技术。TypeScript 提供了几种类型保护的方式:

  • instanceof 操作符:instanceof 操作符用于检查一个对象是否属于某个类。例如:
class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

let person = new Person("John Doe", 30);

if (person instanceof Person) {
  console.log("person is a Person object"); // 输出结果:person is a Person object
}
  • typeof 操作符:typeof 操作符用于获取一个变量的类型。例如:
let str: string = "Hello TypeScript";
let num = 123;

console.log(typeof str); // 输出结果:string
console.log(typeof num); // 输出结果:number
  • in 操作符:in 操作符用于检查一个属性是否属于某个对象。例如:
class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

let person = new Person("John Doe", 30);

if ("name" in person) {
  console.log("person has a name property"); // 输出结果:person has a name property
}

枚举

枚举是一种将一组常量值组织成一个类型的机制。枚举类型可以用于限制变量只能取某一组值中的一个,从而提高代码的可读性和安全性。例如:

enum Color {
  Red,
  Green,
  Blue
}

let color: Color = Color.Red;

switch (color) {
  case Color.Red:
    console.log("The color is red");
    break;
  case Color.Green:
    console.log("The color is green");
    break;
  case Color.Blue:
    console.log("The color is blue");
    break;
}

接口

接口是一种定义对象结构的机制。它了对象应该具有的属性和方法,但并不实现这些属性和方法。接口可以用于对不同对象进行统一管理,从而提高代码的可读性和可维护性。例如:

interface Person {
  name: string;
  age: number;

  greet(): void;
}

class Student implements Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

let student = new Student("John Doe", 30);
student.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.

类是一种创建对象的蓝图。它定义了对象的属性和方法,以及对象的创建方式。类可以用于组织和管理代码,从而提高代码的可读性和可维护性。例如:

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

let person = new Person("John Doe", 30);
person.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.

访问修饰符

访问修饰符用于控制类成员(属性和方法)的访问权限。TypeScript 提供了三种访问修饰符:

  • public:public 访问修饰符表示类成员可以从任何地方访问。
  • protected:protected 访问修饰符表示类成员只能从类本身和其子类访问。
  • private:private 访问修饰符表示类成员只能从类本身访问。

例如:

class Person {
  private name: string;
  protected age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  public greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

class Student extends Person {
  constructor(name: string, age: number) {
    super(name, age);
  }

  public study() {
    console.log("I am studying.");
  }
}

let student = new Student("John Doe", 30);
student.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.
student.study(); // 输出结果:I am studying.

构造函数

构造函数是一种特殊的方法,它会在创建对象时自动调用。构造函数用于初始化对象的属性和方法。例如:

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

let person = new Person("John Doe", 30);
person.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.

继承

继承是一种创建新类(子类)的方法,该类从另一个类(父类)继承属性和方法。子类可以重写父类的属性和方法,也可以定义自己的属性和方法。例如:

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

class Student extends Person {
  constructor(name: string, age: number) {
    super(name, age);
  }

  study() {
    console.log("I am studying.");
  }
}

let student = new Student("John Doe", 30);
student.greet(); // 输出结果:Hello, my name is John Doe and I am