TypeScript -类的知识点详解
在 TypeScript 中,类(Classes)的概念与面向对象编程中的类相似,提供了一种创建和管理对象的方式。以下是 TypeScript 中类的详细知识点:
1. 定义类
类是通过关键字 class
来定义的,它可以包含属性、方法和构造函数:
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}`);
}
}
2. 继承
TypeScript 支持类的继承,使用 extends
关键字:
class Employee extends Person {
jobTitle: string;
constructor(name: string, age: number, jobTitle: string) {
super(name, age); // 调用父类的构造函数
this.jobTitle = jobTitle;
}
describe() {
console.log(`${this.name} is a ${this.age} year old ${this.jobTitle}.`);
}
}
3. 访问修饰符
TypeScript 中的类成员可以有三种访问修饰符:public
(默认)、private
和 protected
:
class Person {
public name: string;
private age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public greet() {
console.log(`Hello, my name is ${this.name}`);
}
protected describe() {
console.log(`I am ${this.age} years old.`);
}
}
4. 抽象类
使用 abstract
关键字可以定义一个抽象类,它不能被实例化,并且可以包含抽象方法,这些方法没有实现,必须由子类提供实现:
abstract class Animal {
abstract makeSound(): void;
}
class Dog extends Animal {
makeSound() {
console.log("Woof woof");
}
}
5. 静态属性和方法
使用 static
关键字可以定义类的静态属性和方法,它们不属于类的实例,而是属于类本身:
class Person {
static count = 0;
constructor(public name: string) {
Person.count++;
}
}
6. 属性初始化器
在类的属性声明中,可以直接初始化属性:
class Person {
name = "Kimi";
age = 30;
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
7. 构造函数和参数属性
在 TypeScript 中,你可以在类的属性声明中直接包含参数属性,这样可以使代码更简洁:
class Person {
constructor(public name: string, public age: number) {}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
8. 存取器(Getters/Setters)
TypeScript 支持使用 get
和 set
关键字来定义存取器:
class Person {
private _age: number;
constructor(age: number) {
this._age = age;
}
get age(): number {
return this._age;
}
set age(value: number) {
if (value < 0) {
throw new Error("Age cannot be negative");
}
this._age = value;
}
}
9. 类表达式
类也可以在表达式中定义,这在创建匿名类时非常有用:
const Person = class {
name: string;
constructor(name: string) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
};
const kimi = new Person("Kimi");
kimi.greet();
10. 类和接口
类可以实现接口,确保类满足接口定义的结构:
interface Greet {
greet(): void;
}
class Person implements Greet {
constructor(public name: string) {}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
11. 类的装饰器
TypeScript 支持装饰器,这是一种特殊类型的声明,它可以被附加到类声明、方法、访问器、属性或参数上:
function classDecorator<T extends { new(...args: any[]): {} }>(constructor: T) {
return class extends constructor {
name: string = "Kimi";
};
}
@classDecorator
class Greeter {
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
类是 TypeScript 中实现面向对象编程的核心概念之一,它们提供了一种封装数据和行为的方式,使得代码更加模块化和可重用。通过使用类,你可以创建复杂的对象模型,并且利用继承、多态和封装等面向对象编程的特性。