Понимая TypeScript и ООП

Если вы в прошлом C#/C++ разработчик или пришли в мир JS из Java, то у вас нет проблем в освоении TypeScript. И уже тем более вы хорошо ориентируетесь в терминологии ООП.

Но если за плечами у вас нет похожего опыта, то, порой, вам сложно общаться с суровыми энтерпрайзными дядьками бекендерами. Сейчас это исправим. И так, что такое поле класса?

Поле класса

Поле класса в ООП мире называется переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени. У полей есть альтернативные названия:

  • атрибут класса
  • переменная-член класса

Поля бывают собственные (обычные) и общие для всех объектов (экземпляров (instance’ов)) класса (статические).

По области видимости поля бывают:

  • public — общедоступные
  • protected —доступуные только для потомков
  • private — доступные только внутри класса

Пример:

class A {
public readonly someNumber :number = 123 ;
public static someString :string = '456';
}
let a :A = new A;
a.someNumber = parseInt( A.someString );

Свойство класса

Свойство — это способ доступа к внутреннему состоянию объекта, имитирующий поле. Обращение к свойству объекта выглядит так же, как и обращение к полю, но, в действительности, реализовано через вызов функции. При попытке задать значение свойства вызывается метод называемый сеттером (setter). А при попытке получить значение свойства — геттер (getter).

Как правило, свойство связано с некоторым внутренним полем объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле.

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

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

В JavaScript геттеры и сеттеры задаются ключевыми словами get и set перед объявлением методов.

Примеры свойств в TypeScript:

class Foo<T> {
    private _bar :T | null = null;
    get bar(): T {
console.log(`Get "bar" value = ${this._bar}`);
return this._bar;
}
    set bar(value: T) {
console.log(`Set "bar" value = ${this._bar}`);
this._bar = value;
}
}
let fooString: Foo<string> = new Foo<string>();
fooString.bar = 'abc';
fooString.bar; // вместо console.log(fooString.bar)
let fooNumber: Foo<number> = new Foo<number>();
fooNumber.bar = 123;
fooNumber.bar;

Ну вот как-то так все это работает. Хотя фронтендеры могут сказать:

— “Да какая разница? Не все ли равно кого мочить?”

(с) 9 рота

Ну как сказать. Все-таки это фундаментальные основы и терминология призвана выражать четко свои мысли и намерения. Мы же программисты, йопта.