9

"Получение и установка значений в TypeScript: методы get и set"

7

Я пытаюсь создать методы get и set для свойства:

private _name: string;

Name() {
    get:
    {
        return this._name;
    }
    set:
    {
        this._name = ???;
    }
}

Какой ключевое слово следует использовать для задания значения?

5 ответ(ов)

1

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' будет вызван.

0

Вот рабочий пример, который должен указать вам правильное направление:

class Foo {
    _name;

    get Name() {
        return this._name;
    }

    set Name(val) {
        this._name = val;
    }
}

Геттеры и сеттеры в JavaScript — это просто обычные функции. Сеттер — это функция, которая принимает параметр, значение которого является устанавливаемым значением.

0

Вы можете написать такой код:

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, а также геттерами и сеттерами для них. Конструктор принимает параметры, которые можно использовать для инициализации этих полей. Вы также можете наблюдать за действиями с полями, так как в сеттерах и геттерах присутствуют консольные выводы.

0

В 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';  

Таким образом, сеттеры и геттеры позволяют контролировать, как свойства вашего объекта используются и изменяются, благодаря чему можно избежать ошибок и обеспечить валидацию данных.

0

Я думаю, я понимаю, почему это может быть запутанным. В вашем примере мы хотели создать геттеры и сеттеры для переменной _name. Но мы достигаем этого, создавая геттеры и сеттеры для другой переменной, не связанной с ней, — Name.

Рассмотрим следующий код:

class Car {
    private tiresCount = 4;
    get yourCarTiresCount() {
        return this.tiresCount;
    }
    set yourCarTiresCount(count) {
        alert('Вы не должны менять количество шин у автомобиля');
    }
}

Данный код делает следующее:

  1. Ключевые слова get и set создают геттер и сеттер для yourCarTiresCount (а не для tiresCount).

Геттер выглядит так:

function () {
    return this.tiresCount;
}

А сеттер так:

function (count) {
    alert('Вы не должны менять количество шин у автомобиля');
}

Это означает, что каждый раз, когда мы обращаемся к new Car().yourCarTiresCount, срабатывает геттер. А при вызове new Car().yourCarTiresCount = '7' срабатывает сеттер.

Таким образом, мы косвенно создаем геттер, но не сеттер, для приватной переменной tiresCount.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь