类
基础语法
class Person {
// 公有属性
public name: string;
// 私有属性
private age: number;
// 受保护属性
protected occupation: string;
// 只读属性(必须在声明时或在构造函数中初始化)
readonly birthYear: number;
// 静态属性(属于类本身,而不是类的实例)
static species: string = "Homo sapiens";
// 构造函数
constructor(name: string, age: number, occupation: string, birthYear: number) {
this.name = name;
this.age = age; // 直接在构造函数中设置私有属性
this.occupation = occupation; // 直接在构造函数中设置受保护属性
this.birthYear = birthYear; // 初始化只读属性
}
// 公有方法
public greet(): void {
console.log(`Hello, my name is ${this.name}.`);
}
// 私有方法(通常用于内部逻辑,外部和派生类都不可访问)
private calculateAge(): number {
const currentYear = new Date().getFullYear();
return currentYear - this.birthYear;
}
// 受保护方法(可在派生类中访问)
protected getOccupationDetails(): string {
return `I am a ${this.occupation}.`;
}
// 静态方法(可通过类名直接调用,无需创建实例)
static getSpecies(): string {
return Person.species;
}
// 一个使用私有方法的示例
public sayMyAge(): void {
console.log(`I am ${this.calculateAge()} years old.`);
}
}
// 使用Person类
const alice = new Person("Alice", 30, "Software Engineer", 1990);
alice.greet(); // 正确:调用公有方法
console.log(alice.name); // 正确:访问公有属性
// console.log(alice.age); // 错误:私有属性不可从外部访问
// console.log(alice.occupation); // 错误:受保护属性在外部不可直接访问(尽管技术上可以通过TypeScript的某些特性绕过,但这不是推荐做法)
alice.sayMyAge(); // 正确:调用公有方法,该方法内部使用了私有方法
// 静态属性和方法的访问
console.log(Person.getSpecies()); // 正确:通过类名直接访问静态方法
// 尝试访问私有和受保护成员将导致编译错误(这里未展示,因为它们是编译时错误)
修饰符
修饰符 | 成员类型 | 作用 | 使用场景 |
---|---|---|---|
public | 属性、方法 | 成员在类的内部、派生类以及类的实例中都是可访问的。这是默认的访问级别。 | 当成员需要在类的外部、派生类以及类的实例中均可访问时使用。 |
protected | 属性、方法 | 成员在类的内部和派生类中是可访问的,但在类的实例中不可直接访问。 | 当成员需要在派生类中可访问,但在类的外部或实例中不应直接访问时使用。常用于基类中的辅助方法或属性。 |
private | 属性、方法 | 成员仅在类的内部是可访问的,在类的外部、派生类或类的实例中均不可访问。 | 当成员是类的内部实现细节,不希望被外部或派生类访问时使用。 |
static | 属性、方法 | 成员属于类本身,而不是类的实例。它们通过类名来访问,而不是通过类的实例。 | 当成员与类的所有实例共享状态或行为时使用,如工具函数、配置信息等。 |
readonly | 属性 | 属性在初始化后不可修改。仅对属性有效,且必须在声明时或在构造函数中初始化。 | 当需要确保属性值在创建后不再改变时使用,常用于配置参数或常量值。 |
组成元素
类的组成元素:
- 构造函数
- 成员属性
- 静态属性
- 静态方法
- 成员方法
- 私有字段 - 以
"#"
开头的属性为私有字段- 私有字段以
#
字符开头 - 每个私有字段名称都唯一地限定于其包含的类;
- 不能在私有字段上使用
TypeScript
可访问性修饰符(如public
或private
); - 私有字段不能在包含的类之外访问,甚至不能被检测到。
- 私有字段以
使用示例
- 定义一个类
class Person {
// 静态属性
static name:string = "name"
// 成员属性(实例属性)
age:number = 0
// 构造函数
constructor(age:number){
this.age = age
}
// 静态方法
static getAge(){
return this.age
}
// 成员方法
getName(){
return this.name
}
}
// 通过 new 新建实例
const t = new Persion(17)
- 在构造函数同时声明一个变量
class Person {
// 构造函数
constructor(public age:number){
this.age = age
}
}
静态属性
静态属性使用 static
关键字声明:
- 定义
class Person {
static type:string = "human"
}
- 使用
console.log(Person.tpye)