Skip to Content
Начало типизацииТипизация классов

Типизация классов

Для чего это нужно? Чтобы можно было выставлять разные модификаторы доступа и не только: readonly поля, методы, дженерики

Стандартный пример:

class { public readonly
Animal.name: string
name
: string;
public constructor(
name: string
name
: 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 {};
Class 'User' incorrectly implements interface 'IUser'. Type 'User' is missing the following properties from type 'IUser': id, name, created_at

Однако тот вариант, предложенный мной, на деле плохой, ибо мы можем изменять поле 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 после модификатора доступа

В общем-то здесь больше нет ничего удивительно нового, так что, удмаю, что на этом всё

Last updated on