Почему TS не видит геттеры?

TypeScript обладает мощной системой статической типизации, которая позволяет разработчикам обнаруживать и предотвращать ошибки на этапе компиляции. Однако, иногда может возникнуть вопрос, почему TypeScript не видит геттеры. Давайте разберемся в этом подробнее.

Геттеры (или методы-аксессоры) позволяют получать значение некоторого свойства объекта с помощью специального синтаксиса, как если бы это было свойство, хотя на самом деле геттер является функцией.

Например, у нас есть класс Person:

class Person {
  private _name: string;

  constructor(name: string) {
    this._name = name;
  }

  get name(): string {
    return this._name;
  }
}

Здесь мы объявляем приватное свойство _name и геттер name, который возвращает значение этого свойства.

Однако, когда мы пытаемся обратиться к свойству name через экземпляр класса Person, TypeScript вызывает ошибку:

const person = new Person('John');
console.log(person.name); // Ошибка: Property 'name' does not exist on type 'Person'.

Почему это происходит?

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

Когда мы пытаемся обращаться к геттеру name, TypeScript пытается обнаружить свойство name в классе Person, но такого свойства нет. Вместо этого, мы должны вызывать геттер как функцию:

console.log(person.name()); // John

Таким образом, чтобы преодолеть эту проблему, Необходимо удалить ключевое слово private перед _name:

class Person {
  _name: string;

  constructor(name: string) {
    this._name = name;
  }

  get name(): string {
    return this._name;
  }
}

Теперь, когда мы обращаемся к геттеру name, TypeScript уже не выдает ошибку:

const person = new Person('John');
console.log(person.name); // John

В заключение, TypeScript не видит геттеры, потому что они являются функциями, а не обычными свойствами объекта. Проверьте, что вы правильно обращаетесь к геттеру как к функции, и убедитесь, что свойство, к которому обращается геттер, объявлено публичным (или protected), а не приватным.