Menu
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

TypeScript 类


TypeScript 为 JavaScript 类添加了类型和可见性修饰符。

了解更多关于 JavaScript 类 这里.


成员:类型

类的成员(属性和方法)使用类型标注进行类型化,类似于变量。

示例

class Person {
  name: string;
}

const person = new Person();
person.name = "Jane";
自己尝试 »

成员:可见性

类成员还可以被赋予特殊的修饰符,这些修饰符会影响可见性。

TypeScript 中有三个主要的可见性修饰符。

  • public - (默认)允许从任何地方访问类成员
  • private - 仅允许从类内部访问类成员
  • protected - 允许从自身和继承它的任何类访问类成员,这将在下面的继承部分中介绍

示例

class Person {
  private name: string;

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

  public getName(): string {
    return this.name;
  }
}

const person = new Person("Jane");
console.log(person.getName()); // 由于 person.name 是私有的,所以无法从类外部访问它
自己尝试 »
类中的 this 关键字通常指的是类的实例。阅读更多关于 this 这里.

参数属性

TypeScript 提供了一种方便的方式来在构造函数中定义类成员,方法是在参数中添加可见性修饰符。

示例

class Person {
  // name 是一个私有成员变量
  public constructor(private name: string) {}

  public getName(): string {
    return this.name;
  }
}

const person = new Person("Jane");
console.log(person.getName());
自己尝试 »

只读

类似于数组,readonly 关键字可以防止更改类成员。

示例

class Person {
  private readonly name: string;

  public constructor(name: string) {
    // 在此初始定义之后,name 无法更改,初始定义必须在其声明处或构造函数中进行。
    this.name = name;
  }

  public getName(): string {
    return this.name;
  }
}

const person = new Person("Jane");
console.log(person.getName());
自己尝试 »

w3schools CERTIFIED . 2022

获得认证!

完成 TypeScript 模块,完成练习,参加考试,成为 w3schools 认证人员!!

45 美元 注册

继承:实现

接口(在 这里 中介绍)可用于通过 implements 关键字定义类必须遵循的类型。

示例

interface Shape {
  getArea: () => number;
}

class Rectangle implements Shape {
  public constructor(protected readonly width: number, protected readonly height: number) {}

  public getArea(): number {
    return this.width * this.height;
  }
}
自己尝试 »
一个类可以通过在 implements 之后列出每个接口,并用逗号隔开,来实现多个接口,例如:class Rectangle implements Shape, Colored {

继承:扩展

类可以通过 extends 关键字扩展彼此。一个类只能扩展另一个类。

示例

interface Shape {
  getArea: () => number;
}

class Rectangle implements Shape {
  public constructor(protected readonly width: number, protected readonly height: number) {}

  public getArea(): number {
    return this.width * this.height;
  }
}

class Square extends Rectangle {
  public constructor(width: number) {
    super(width, width);
  }

  // getArea 从 Rectangle 继承而来
}
自己尝试 »

重写

当一个类扩展另一个类时,它可以用相同名称的成员替换父类的成员。

较新的 TypeScript 版本允许使用 override 关键字显式标记此操作。

示例

interface Shape {
  getArea: () => number;
}

class Rectangle implements Shape {
  // 使用 protected 修饰符来访问这些成员,允许从扩展此类的类(例如 Square)访问
  public constructor(protected readonly width: number, protected readonly height: number) {}

  public getArea(): number {
    return this.width * this.height;
  }

  public toString(): string {
    return `Rectangle[width=${this.width}, height=${this.height}]`;
  }
}

class Square extends Rectangle {
  public constructor(width: number) {
    super(width, width);
  }

  // 此 toString 替换了 Rectangle 中的 toString
  public override toString(): string {
    return `Square[width=${this.width}]`;
  }
}
自己尝试 »
默认情况下,当重写方法时,override 关键字是可选的,它只帮助防止意外重写不存在的方法。使用设置 noImplicitOverride 强制在重写时使用它。

抽象类

类可以以一种允许它们用作其他类的基类的方式编写,而无需实现所有成员。这是通过使用 abstract 关键字来完成的。未实现的成员也使用 abstract 关键字。

示例

abstract class Polygon {
  public abstract getArea(): number;

  public toString(): string {
    return `Polygon[area=${this.getArea()}]`;
  }
}

class Rectangle extends Polygon {
  public constructor(protected readonly width: number, protected readonly height: number) {
    super();
  }

  public getArea(): number {
    return this.width * this.height;
  }
}
自己尝试 »
无法直接实例化抽象类,因为它们没有实现所有成员。

TypeScript 练习

通过练习测试自己

练习

指定 Person.name 只能在类中访问,但方法 Person.getName() 可以在任何地方访问

class Person {
  name: string;

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

  getName(): string {
  return this.name;
 }
}

开始练习


×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.