Типизация классов
Для чего это нужно? Чтобы можно было выставлять разные модификаторы доступа и не только: readonly поля, методы, дженерики
Стандартный пример:
class {
public readonly Animal.name: stringname: string;
public constructor(name: stringname: string) {
this. = ;
}
}Тут нет ничего примечательного. Поле name у нас выступает в качестве публичного, доступного только для чтения
При желании, этот код можно упростить:
class {
public constructor(public readonly : string) {}
}Здесь мы прямо в конструкторе указываем всё, что нам нужно. И тот, и этот код равнозначны. Однако я предпочитаю второй, нежели первый
- Почему у конструктора указан модификатор доступа? Его можно сделать приватным и защищённым?
- Да, конструктор можно сделать приватным и защищённым и это даже используется, только довольно редко (сам я не видел)
- Это мы обсудим после того, как изучим наследование
- Также стоит сказать, что нужно всегда ставить модификаторы доступа, даже если по умолчанию стоит
public
Наследование через implements
interface IUser {
: string;
: string;
: string;
?: string
};
class implements IUser {
public readonly : string;
public ?: string = ;
public constructor(
public readonly : string,
public readonly : string,
) {
this. = new ().()
}
public () {
this. = new ().();
}
}Здесь нет ничего сложного. implements просто помогает нам писать более шаблонный класс с помощью типа, которые расширяет наш класс
interface IUser {
: string;
: string;
: string;
?: string
};
class User implements IUser {};Однако тот вариант, предложенный мной, на деле плохой, ибо мы можем изменять поле updated_at напрямую, так как нам его защитить?
interface IUser {
: string;
: string;
: string;
?: string
};
class implements IUser {
private ?: string = ;
public readonly : string;
public constructor(
public readonly : string,
public readonly : string,
) {
this. = new ().()
}
public get () {
return this.;
}
protected () {
this. = new ().();
}
}Здесь мы используем protected поле — оно даёт нам возможность использовать это поле в расширяемых нами классах.
Также private поле, оно доступно только исходному классу и его невозможно получить извне
Наследование через extends
const = 100;
class {
private : number;
private : number;
protected : number;
public constructor(
public readonly : string,
: number
) {
this. = ;
this. = .( * 1.5);
this. = 100 - this.;
}
public () {
.("Вы погладили " + this.);
const = this. + 5;
const = - this.;
this. = >
?
: ;
}
public () {
this.++;
this.--;
}
public () {
this. = ;
.(this. + " поспал и полон сил!");
}
protected set (: number) {
const = this. + ;
const = - this.;
this. = >
?
: ;
}
public get (): number {
return this.;
}
public get (): number {
return this.;
}
}
class extends {
public constructor(
: string,
: number
) {
super(, );
}
public () {
if (this. < 20) {
.(this. + " слишком устал");
return;
}
.("Вы кинули кость " + this.);
this. = -15;
}
}Ух, ну надеюсь я не перестарался, что ж, пора разбирать код (хотя это должны делать Вы).
Наследование даёт нам возможность использовать методы и поля от наследуемого класса, то есть
мы сможем использовать Animal.prototype.pet() из Dog.prototype.pet(),
также можно перезаписывать эти методы через override после модификатора доступа
В общем-то здесь больше нет ничего удивительно нового, так что, удмаю, что на этом всё