"Получение и установка значений в TypeScript: методы get и set"
Я пытаюсь создать методы get и set для свойства:
private _name: string;
Name() {
get:
{
return this._name;
}
set:
{
this._name = ???;
}
}
Какой ключевое слово следует использовать для задания значения?
5 ответ(ов)
Ezward уже предоставил хороший ответ, но я заметил, что в одном из комментариев спрашивают, как это используется. Для таких людей, как я, которые наткнулись на этот вопрос, было бы полезно иметь ссылку на официальную документацию по геттерам и сеттерам на сайте TypeScript, так как она хорошо объясняет эту тему, надеюсь, всегда будет актуальной по мере внесения изменений и содержит примеры использования:
http://www.typescriptlang.org/docs/handbook/classes.html
В частности, для тех, кто не знаком с этой темой, обратите внимание, что слово 'get' не нужно включать в вызов геттера (и аналогично для сеттеров):
var myBar = myFoo.getBar(); // неправильно
var myBar = myFoo.get('bar'); // неправильно
Нужно просто делать так:
var myBar = myFoo.bar; // правильно (геттер)
myFoo.bar = true; // правильно (сеттер) (false тоже, разумеется, правильно!)
Предположим, у нас есть класс:
class foo {
private _bar:boolean = false;
get bar():boolean {
return this._bar;
}
set bar(theBar:boolean) {
this._bar = theBar;
}
}
Тогда геттер 'bar' для приватного свойства '_bar' будет вызван.
Вот рабочий пример, который должен указать вам правильное направление:
class Foo {
_name;
get Name() {
return this._name;
}
set Name(val) {
this._name = val;
}
}
Геттеры и сеттеры в JavaScript — это просто обычные функции. Сеттер — это функция, которая принимает параметр, значение которого является устанавливаемым значением.
Вы можете написать такой код:
class Human {
private firstName: string;
private lastName: string;
constructor(
public FirstName?: string,
public LastName?: string
) {
this.firstName = FirstName || '';
this.lastName = LastName || '';
}
get FirstName(): string {
console.log("Get FirstName: ", this.firstName);
return this.firstName;
}
set FirstName(value: string) {
console.log("Set FirstName: ", value);
this.firstName = value;
}
get LastName(): string {
console.log("Get LastName: ", this.lastName);
return this.lastName;
}
set LastName(value: string) {
console.log("Set LastName: ", value);
this.lastName = value;
}
}
Это пример класса на TypeScript с приватными полями firstName
и lastName
, а также геттерами и сеттерами для них. Конструктор принимает параметры, которые можно использовать для инициализации этих полей. Вы также можете наблюдать за действиями с полями, так как в сеттерах и геттерах присутствуют консольные выводы.
В TypeScript есть геттеры и сеттеры, которые позволяют более тонко контролировать доступ к свойствам объекта (геттер) и их обновление (сеттер) снаружи объекта. Вместо того чтобы обращаться к свойству напрямую, вызывается прокси-функция.
Пример:
class Person {
constructor(name: string) {
this._name = name;
}
private _name: string;
get name() {
return this._name;
}
// Сначала проверяет длину имени, а затем обновляет его.
set name(name: string) {
if (name.length > 10) {
throw new Error("Имя должно быть не длиннее 10 символов");
}
this._name = name;
}
doStuff() {
this._name = 'foofooooooofoooo';
}
}
const person = new Person('Willem');
// Не выбрасывает ошибку, так как функция-сеттер не вызывается в методе объекта при изменении this._name
person.doStuff();
// Выбрасывает ошибку, потому что срабатывает сеттер, а имя длиннее 10 символов
person.name = 'barbarbarbarbarbar';
Таким образом, сеттеры и геттеры позволяют контролировать, как свойства вашего объекта используются и изменяются, благодаря чему можно избежать ошибок и обеспечить валидацию данных.
Я думаю, я понимаю, почему это может быть запутанным. В вашем примере мы хотели создать геттеры и сеттеры для переменной _name
. Но мы достигаем этого, создавая геттеры и сеттеры для другой переменной, не связанной с ней, — Name
.
Рассмотрим следующий код:
class Car {
private tiresCount = 4;
get yourCarTiresCount() {
return this.tiresCount;
}
set yourCarTiresCount(count) {
alert('Вы не должны менять количество шин у автомобиля');
}
}
Данный код делает следующее:
- Ключевые слова
get
иset
создают геттер и сеттер дляyourCarTiresCount
(а не дляtiresCount
).
Геттер выглядит так:
function () {
return this.tiresCount;
}
А сеттер так:
function (count) {
alert('Вы не должны менять количество шин у автомобиля');
}
Это означает, что каждый раз, когда мы обращаемся к new Car().yourCarTiresCount
, срабатывает геттер. А при вызове new Car().yourCarTiresCount = '7'
срабатывает сеттер.
Таким образом, мы косвенно создаем геттер, но не сеттер, для приватной переменной tiresCount
.
Интерфейсы vs Типы в TypeScript
В TypeScript, что означает оператор ! (восклицательный знак) при разыменовании члена?
Как явно задать новое свойство у `window` в TypeScript?
Как динамически назначить свойства объекту в TypeScript?
Что такое ошибка "не может быть присвоено параметру типа never" в TypeScript?