注意: 如果您是 TypeScript 新手,请先查看我们的 TypeScript 入门 教程。
TypeScript 的 getter 和 setter 是特殊方法,它们提供对对象属性的可控访问。
- Getter 允许我们将
private
属性像普通字段一样读取。 - Setter 允许我们在为字段赋值时添加自定义逻辑。
对象属性的类型
在 TypeScript 中,对象属性可以通过两种方式访问。
- 数据属性:它们直接保存值。
- 访问器属性:它们是我们用于访问或修改值的
get()
和set()
方法。
数据属性
TypeScript 数据属性是对象中直接保存值的键值对。它可以存储任何类型的数据,例如字符串、数字、对象或函数。
例如,
class Student {
// Data property
private _firstName: string = "Monica";
}
访问器属性
在 TypeScript 中,访问器属性是用于获取或设置对象值的方。这些是通过get
和set
关键字定义的。
get
:用于定义 getter 方法以获取属性值。set
:用于定义 setter 方法以设置属性值。
TypeScript Getter
在 TypeScript 中,getter 方法用于以可控的方式访问类的(通常是私有的)属性。例如,
class Student {
// Data property
private _firstName: string = "Monica";
// Getter method
get getName(): string {
return this._firstName;
}
}
const student = new Student();
// Accessing the getter
console.log(student.getName);
输出
Monica
在上面的程序中,创建了一个 getter 方法 getName()
来访问对象的属性。
get getName() {
return this._firstName;
}
注意:要创建 getter 方法,请使用 get
关键字。
并且在访问值时,我们将其视为一个属性来访问。
student.getName;
常见错误
在前面的示例中,直接尝试访问私有属性会引发错误。例如,
console.log(student._firstName);
发生这种情况是因为 _firstName
被标记为 private
,这意味着它只能在类内部访问,而不能从外部访问。
另一个常见的错误是将 getter 像函数一样调用。例如,
console.log(student.getName());
在这里,getName
是一个 getter,而不是一个方法。所以它应该像一个普通属性一样被访问,无需括号。
console.log(student.getName);
TypeScript Setter
在 TypeScript 中,setter 方法用于更新类属性的值。例如,
class Student {
private _firstName: string = 'Monica';
// Getter method
get firstName(): string {
return this._firstName;
}
// Setter method
set changeName(newName: string) {
this._firstName = newName;
}
}
const student = new Student();
console.log(student.firstName); // Monica
// Change(set) object property using a setter
student.changeName = 'Sarah';
console.log(student.firstName); // Sarah
在上面的示例中,setter 方法用于更改对象的值。
set changeName(newName: string) {
this._firstName = newName;
}
注意:要创建 setter 方法,请使用 set
关键字。
如上程序所示,firstName
的值为 Monica
。
然后值更改为 Sarah
。
student.changeName = 'Sarah';
注意:Setter 必须有且仅有一个形式参数。
示例:TypeScript Getter 和 Setter
现在,让我们编写一个包含 getter 和 setter 方法的独立程序。我们还将实现 setter 方法中的一些自定义逻辑。
// Define a class named 'Person'
class Person {
private _name = "";
private _age = 0;
// Getter for 'name'
get name() {
return this._name;
}
// Setter for 'name' - converts any value to string
set name(value: string | number | boolean) {
this._name = String(value);
}
// Getter for 'age'
get age() {
return this._age;
}
// Setter for 'age' - converts to number, uses 0 if invalid
set age(value: string | number | boolean) {
const num = Number(value);
this._age = Number.isFinite(num) ? num : 0;
}
}
const person = new Person();
person.name = "Alice";
person.age = "30";
console.log(person.name);
console.log(person.age);
输出
Alice 30
这里,Person
类有两个数据属性:_name
和 _age
。因此,我们创建了它们各自的 getter 和 setter 方法。
我们在 setter 方法中实现了以下逻辑:
name()
- 此 setter 使用String()
方法将参数转换为字符串类型,并将其赋值给_name
属性。age()
- 此 setter 使用Number()
方法将参数转换为数字类型,并将其赋值给_age
属性。如果参数无效,则将_age
设置为 0。
阅读更多