g1er / Andrew

0 stars 0 forks source link

Classes TypeScript #23

Open IgorKulishov opened 6 years ago

IgorKulishov commented 6 years ago

Начинаем изучать Классы.

Я нашел хорошее описание классов на русском языке с примерами - можно будет туда тоже обращаться: http://typescript-lang.ru/docs/Classes.html Я буду давать по этой ссылке примеры с объяснениями, иногда останавливаясь на некоторых местах подробней.

Итак как и во всех объектно-ориентированных языках в TypeScript есть классы (во многом ты найдешь для себя синтаксис знакомым).

1. Рассмотрим простой пример с конструктором, свойством и методом (пример по выше-указанной ссылке):

class Greeter {
    greeting: string;
    private prefix: string  = "Hello ";
    constructor(message: string) {
        this.greeting = message;
    }
    greet(): string {
        return this.prefix + this.greeting;
    }
}

let greeter = new Greeter("world");

Несколько моментов: А) название класса обычно с большой буквы: Greeter Б) свойство greeting имеет тип string и если не определить, то по умолчанию public т.е. тоже самое что и :

public greeting: string;

Напомню private означает что private метод или private свойство могут быть вызваны только внутри класса (при обращении одного метода к другому private свойству или другому private методу внутри класса) , т.е. к примеру свойство private prefix является private и доступно только внутри метода greet(). В свое время public означает что метод или свойство будут доступны для обращения / вызова внутри нового объекта после создания этого объекта от класса при помощи оператора new, например, после создания greeter:

let greeter = new Greeter("world");

т.о. можно обратиться к свойству greeter.greeting и методу greeter.greet(). Однако свойство prefix является private поэтому не доступно внутри объекта greeter.prefix, но доступно внутри метода greet(). В) конструктор в нашем случае имеет один параметр message, тип которого определен как string:

constructor(message: string)

Г) внутри фигурных скобок constructor мы присваеваем значение передаваемого параметра свойству greeting:

    constructor(message: string) {
        this.greeting = message;
    }

Т.о. при создании нового объекта от класса Greeter при помощи оператора new, аргумент внутри скобок передется значению свойства greeting:

let greeterSample = new Greeter("some_param");

Д) Далее внутра класса у нас есть public метод greet():

   greet(): string {
        return this.prefix + this.greeting;
    }

тоже самое

public greet(): string {
        return this.prefix + this.greeting;
    }

Обращаю внимание что после названия метода greet и скобок () стоит двоеточие и тип string - так обозначается тип данных возвращаемых методом, т.е. в нашем случае метод возвращает тип данных string.

IgorKulishov commented 6 years ago

Задание: Пожалуйста определи тип аргумента внутри конструктора: constructor(private name){..} в файле https://github.com/g1er/Andrew/blob/master/typescript/ts/products.ts и закомить.

напомню что можно определить тип переменных как string или любой другой или можно определить как any в этом случае тип может быть любым.

IgorKulishov commented 6 years ago

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

Я пытался рассказать о типе возвращаемых данных при использовании setter и getter. При этом setter на самом деле ничего не возвращает поскольку он только задает значение свойства класса. В тоже время getter по определению возвращает значение свойства класса и таким образом имеет возвращаемый тип данных.

Рассмотрим подробнее и обратимся к официальной документации https://www.typescriptlang.org/docs/handbook/classes.html

Согласно документации в примере для getter:

    get fullName(): string {
        return this._fullName;
    }

можно заметить что getter имеет возвращаемый тип данных :string так же как и любое свойство или метод класса.

Кроме того преведен пример для setter:

    set fullName(newName: string) {
        if (passcode && passcode == "secret passcode") {
            this._fullName = newName;
        }
        else {
            console.log("Error: Unauthorized update of employee!");
        }
    }

В примере на setter видно, что определен тип параметра newName:string, но set fullName не имеет типа возвращаемых данных и это логично, поскольку set ничего не возвращает, а только задает. Иногда можно встретить так же тип данных определенный как ":void" - это означает что на самом деле ничего не возвращается.

Свой старый пример я уберу.

То что я ошибочно назвал: не может иметь анотацию возвращаемого типа на самом деле означало: А) getter: а) get fullName(): string - возвращает тип данных б) так же может иметь параметр с определенным типом данных (в нашем примере нет параметра у getter) Б) setter: а) сам setter ничего не возвращает по определению, так что мы не указываем возвращаемый тип самого setter или ставим set fullName(newName: string): void б) в setter мы передаем параметры, поэтому правилом хорошего тона определить тип данных параметра set fullName(newName: string)

g1er commented 6 years ago

Так в итоге для set мы можем указывать тип параметра? В предыдущем пояснении ты писал, что обработчик выдаст ошибку. Или ты в этом тоже ошибся?

IgorKulishov commented 6 years ago

Как видешь я привёл выше пример для set newName : string

set fullName(newName: string) {
        if (passcode && passcode == "secret passcode") {
            this._fullName = newName;
        }
        else {
            console.log("Error: Unauthorized update of employee!");
        }
    }
IgorKulishov commented 6 years ago

Просьба прочитать еще раз пример выше, попробовать пробилдить на компе (посмотреть если есть ошибки). Попробуй так же в setter поставить тип возвращаемых данных как :void и прокомпелировать. Если все пройдет нормально просьба провести соответствующие моим комментариям на PR (https://github.com/g1er/Andrew/pull/26) изменения в коде и повторно запушить , после чего я утвержу PR (pull request). Напиши если есть вопросы. Спасибо.

g1er commented 6 years ago

Все, я понял. Я попробовал поставить :void в сеттер, но VSC стал сразу ругаться Метод доступа set не может иметь заметку с типом возвращаемого значения. поэтому я даже не компилировал. Просто определил тип параметра в SET.

просьба провести соответствующие моим комментариям на PR (#26) изменения в коде

я перешел по ссылке на PR #26 и если честно никаких комментариев там на обнаружил. может не там смотрел? В итоге я запушил на свой бренч изменения с СЕТом. Если что-то не доделал, дай знать