TypeScript学习笔记-3

91 阅读2分钟

一、类与继承

  • 使用 class 可以定义对象的模板。

  • 构造函数 constructor 用于初始化类的属性。

  • 子类使用 extends 关键字继承父类。

  • 子类可以调用 super() 访问父类构造器,也可以重写父类方法。

示例:

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

  sayHello() {
    console.log(`Hello, I am ${this.name}`);
  }
}

class Student extends Person {
  grade: number;
  constructor(name: string, grade: number) {
    super(name);
    this.grade = grade;
  }

  sayHello() {
    console.log(`Hi, I'm ${this.name}, in grade ${this.grade}`);
  }
}

二、属性修饰符:publicprotectedprivatereadonly

  • public:默认值,任何地方都可以访问。

  • protected:只能在类和其子类中访问。

  • private:只能在类内部访问。

  • readonly:只读属性,初始化后不能修改。

示例:

class Animal {
  public name: string;
  protected age: number;
  private id: string;
  readonly species: string = "dog";

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

class Dog extends Animal {
  constructor(name: string, age: number, id: string) {
    super(name, age, id);
    console.log(this.age); // ✅ 访问 protected
    // console.log(this.id); // ❌ 不能访问 private
  }
}

三、抽象类(abstract

  • 抽象类不能被实例化,只能被继承。

  • 可以包含抽象方法(无实现),子类必须实现。

  • 可用于统一接口、规范结构。

示例:

abstract class Package {
  abstract calculatePrice(): number;

  printLabel() {
    console.log("Shipping label...");
  }
}

class ExpressPackage extends Package {
  calculatePrice(): number {
    return 25.5;
  }
}

四、接口(interface

  • 用于定义对象结构、函数签名、类的契约。

  • 可以继承多个接口。

  • 类可通过 implements 实现接口。

示例:

interface User {
  name: string;
  age: number;
}

interface Login {
  login(username: string, password: string): boolean;
}

class Admin implements User, Login {
  name: string;
  age: number;

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

  login(username: string, password: string): boolean {
    return username === this.name && password === "123";
  }
}

五、类型别名(type)与接口的区别

  • type 更适合联合类型、交叉类型、元组、条件类型等高级类型表达。

  • interface 更适合结构性定义和类的继承。

  • interface 支持声明合并,type 不支持。

示例:

type Result = "success" | "fail"; // 联合类型

type Position = { x: number } & { y: number }; // 交叉类型

interface Point {
  x: number;
  y: number;
}

interface Point {
  z: number;
}
// 合并后是 { x: number; y: number; z: number }

六、泛型(<T>

  • 提高代码灵活性和复用性。

  • 可用于函数、接口、类。

  • 调用时传入具体类型。

示例:泛型函数

function identity<T>(value: T): T {
  return value;
}

identity<string>("hello");
identity<number>(123);

示例:泛型接口

interface ApiResponse<T> {
  data: T;
  code: number;
  message: string;
}

const res: ApiResponse<string> = {
  data: "ok",
  code: 200,
  message: "success"
};

示例:泛型类

class Container<T> {
  private value: T;
  constructor(value: T) {
    this.value = value;
  }

  get(): T {
    return this.value;
  }
}

const stringBox = new Container<string>("hello");

七、类型声明文件(.d.ts

  • 用于为 JavaScript 库提供类型提示。

  • 帮助 TypeScript 编译器检查类型。

  • 通常用于第三方库(如 jQuery)中。

示例:声明函数类型

declare function greet(name: string): void;

greet("Tom"); // 编译器能识别类型

总结要点

特性类型别名 type接口 interface
可用于对象结构
可用于联合、交叉类型
支持声明合并
类的实现使用一般不推荐class implements Interface
更适用场景高级类型、函数、元组、条件类型面向对象、类结构化、扩展型设计