TypeScript 中使用 getter 和 setter
使用 get
和 set
关键字在 TypeScript 中定义 getter 和 setter。 getter 使我们能够将属性绑定到在访问属性时调用的函数,而 setter 将属性绑定到在尝试设置属性时调用的函数。
class Developer {
private _language = '';
private _tasks: string[] = [];
get language() {
return this._language;
}
set language(value: string) {
this._language = value;
}
get tasks() {
return this._tasks;
}
set tasks(value: string[]) {
this._tasks = value;
}
}
const dev = new Developer();
dev.language = 'TypeScript';
console.log(dev.language); // 👉️ "TypeScript"
dev.tasks = ['develop', 'test'];
dev.tasks.push('ship');
console.log(dev.tasks); // ['develop', 'test', 'ship']
Developer 类有 2 个 getter
和 setter
。
get 语法将对象属性绑定到函数,因此每次访问该属性时,都会调用该函数。
当我们访问类实例的语言属性时,我们调用的是 language() 方法。
set 语法将对象属性绑定到函数,每次尝试设置属性时,都会调用该函数。
需要注意的是,尽管我们在后台调用类方法,但我们使用
getter
和setter
就像在对象上使用常规属性一样。
我们不应尝试将 setter 称为 myInstance.mySetter('TypeScript'),而应将属性设置为 myInstance.mySetter = 'TypeScript'。
请注意,我们在类中声明 _language
和 _tasks
属性时使用了 private 关键字。
class Developer {
private _language = '';
private _tasks: string[] = [];
get language() {
return this._language;
}
set language(value: string) {
this._language = value;
}
get tasks() {
return this._tasks;
}
set tasks(value: string[]) {
this._tasks = value;
}
}
具有私有可见性的类成员只能在类本身内部访问。
这很重要,因为我们不希望我们的类的消费者能够访问 _language
和 _tasks
属性。
class Developer {
private _language = '';
private _tasks: string[] = [];
get language() {
return this._language;
}
set language(value: string) {
this._language = value;
}
get tasks() {
return this._tasks;
}
set tasks(value: string[]) {
this._tasks = value;
}
}
const dev = new Developer();
// ⛔️ Error: Property '_language' is private
// and only accessible within class 'Developer'.ts(2341)
console.log(dev._language);
尝试从类外部访问私有属性会导致错误,这正是我们需要的,以确保消费者按预期使用 getter
和 setter
。
使用下划线前缀,因为我们需要一个不同的属性名称,以避免我们的 getter
和 setter
方法中的无限循环。
以下实现会导致无限循环。
class Developer {
private language = 'TypeScript';
set language(value: string) {
// ⛔️ Error: Maximum call stack exceeded
this.language = value;
}
}
const dev = new Developer();
代码中的问题是 - 我们没有使用下划线来为类中的语言属性添加前缀。
因此,每次调用
setter
时,它都会设置属性,并在每次设置属性时不断调用自身。
如果我们只为特定属性定义 getter
,则该属性会自动标记为只读。
class Developer {
private _language = 'TypeScript';
get language() {
return this._language;
}
}
const dev = new Developer();
console.log(dev.language); // 👉️ "TypeScript"
// ⛔️ Cannot assign to 'language' because
//it is a read-only property.ts(2540)
dev.language = 'TypeScript';
我们只为语言属性分配了一个 getter
,因此不能重新分配它。
如果我们没有显式键入 setter
参数,TypeScript 能够从 getter
的返回类型推断它。
class Developer {
private _language = '';
get language() {
return this._language;
}
// 👇️ (parameter) value: string (inferred)
// from getter return type
set language(value) {
this._language = value;
}
}
const dev = new Developer();
dev.language = 'TypeScript';
console.log(dev.language); // 👉️ "TypeScript"
即使我们没有在 setter
中显式键入 value 参数,TypeScript 仍然知道它是 string 类型,因为语言 getter
返回一个 string 类型的值。
我们还可以设置在实例化类时使用 getter
和 setter
的属性的值。
class Developer {
private _language = '';
// 👇️ use a constructor method
constructor(language: string) {
this.language = language;
}
get language() {
return this._language;
}
set language(value: string) {
this._language = value;
}
}
const dev = new Developer('TypeScript');
console.log(dev.language); // 👉️ "TypeScript"
dev.language = 'JavaScript';
console.log(dev.language); // 👉️ "JavaScript"
实例化类时调用构造函数方法。 该方法采用语言参数并使用已定义的设置器初始化其值。
如果我们不想使用 setter 在构造函数中初始化属性,也可以使用 _language
属性。
class Developer {
private _language = '';
constructor(language: string) {
// 👇️ Not using setter (_language instead of language)
this._language = language;
}
get language() {
return this._language;
}
set language(value: string) {
this._language = value;
}
}
const dev = new Developer('TypeScript');
console.log(dev.language); // 👉️ "TypeScript"
dev.language = 'JavaScript';
console.log(dev.language); // 👉️ "JavaScript"
上面的示例没有使用 setter
方法为语言属性设置初始值,因为我们在属性前面加上了下划线。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。