TypeScript 是一种面向对象的编程语言,它扩展了 JavaScript,为其添加了类型系统和其他一些特性。TypeScript 的 class 语法可以让开发者更加方便地使用面向对象的编程方式。本文将详细介绍 TypeScript 的 class 语法的操作和应用,并提供代码案例分析。
在 TypeScript 中,class 关键字可以用来定义一个类。下面是一个简单的 class 定义示例:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name}, and I'm ${this.age} years old.`);
}
}
在上面的示例中,我们定义了一个名为 Person
的类,它有两个属性 name
和 age
,以及一个构造函数和一个方法 sayHello
。构造函数用来初始化 name
和 age
属性,而 sayHello
方法用来输出一个问候语。
在 TypeScript 中,我们可以使用 extends
关键字来实现类的继承。下面是一个继承示例:
class Student extends Person {
grade: number;
constructor(name: string, age: number, grade: number) {
super(name, age);
this.grade = grade;
}
sayHello() {
console.log(`Hello, my name is ${this.name}, and I'm a student in grade ${this.grade}.`);
}
}
在上面的示例中,我们定义了一个名为 Student
的类,它继承了 Person
类,并添加了一个 grade
属性和一个重写的 sayHello
方法。在构造函数中,我们使用 super
关键字来调用父类的构造函数。
通过继承,我们可以实现多态。在上面的示例中,Student
类重写了 sayHello
方法,这意味着当我们调用 sayHello
方法时,如果对象是 Student
类的实例,那么会调用 Student
类中的方法,否则会调用 Person
类中的方法。
在 TypeScript 中,我们可以使用访问修饰符来限制类的属性和方法的访问权限。TypeScript 支持三种访问修饰符:public
、private
和 protected
。
public
:默认的访问修饰符,表示属性和方法可以被任何人访问。private
:表示属性和方法只能在类内部访问。protected
:表示属性和方法可以在类内部和子类中访问。下面是一个访问修饰符示例:
class Animal {
private name: string;
protected age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name}, and I'm ${this.age} years old.`);
}
}
class Cat extends Animal {
constructor(name: string, age: number) {
super(name, age);
}
sayHello() {
console.log(`Hello, I'm a cat, and I'm ${this.age} years old.`);
}
}
const animal = new Animal('Tom', 3);
animal.sayHello(); // 输出:Hello, my name is Tom, and I'm 3 years old.
console.log(animal.name); // 编译错误:属性“name”为私有属性,只能在类“Animal”中访问。
const cat = new Cat('Kitty', 2);
cat.sayHello(); // 输出:Hello, I'm a cat, and I'm 2 years old.
console.log(cat.age); // 输出:2
在上面的示例中,Animal
类中的 name
属性使用了 private
访问修饰符,因此只能在 Animal
类内部访问。而 age
属性使用了 protected
访问修饰符,因此可以在 Animal
类内部和 Cat
类中访问。
在 TypeScript 中,我们可以使用抽象类和接口来定义类的规范。抽象类是一种不能被实例化的类,它只能被继承。接口则是一种定义了一组方法和属性的规范,它可以被类实现。下面是一个抽象类和接口示例:
abstract class Shape {
abstract area(): number;
}
interface Printable {
print(): void;
}
class Rectangle extends Shape implements Printable {
width: number;
height: number;
constructor(width: number, height: number) {
super();
this.width = width;
this.height = height;
}
area() {
return this.width * this.height;
}
print() {
console.log(`The area of the rectangle is ${this.area()}.`);
}
}
const rect = new Rectangle(3, 4);
rect.print(); // 输出:The area of the rectangle is 12.
在上面的示例中,我们定义了一个抽象类 Shape
和一个接口 Printable
。Shape
类中有一个抽象方法 area
,它必须被子类实现。Rectangle
类继承了 Shape
类,并实现了 Printable
接口。Rectangle
类中实现了 area
方法和 print
方法。
在 TypeScript 中,我们可以使用泛型来定义类、函数和接口。泛型可以让我们在编写代码时不必指定具体类型,而是在使用时再指定类型。下面是一个泛型类示例:
class Pair<T, U> {
first: T;
second: U;
constructor(first: T, second: U) {
this.first = first;
this.second = second;
}
}
const pair = new Pair('hello', 123);
console.log(pair.first); // 输出:hello
console.log(pair.second); // 输出:123
在上面的示例中,我们定义了一个泛型类 Pair
,它有两个类型参数 T
和 U
。在创建 Pair
对象时,我们可以指定 T
和 U
的具体类型。
本文详细介绍了 TypeScript 的 class 语法的操作和应用,包括基本语法、继承和多态、访问修饰符、抽象类和接口以及泛型。通过这些示例,我们可以更好地理解和应用 TypeScript 的 class 语法。