Open IgorKulishov opened 6 years ago
Задание: Пожалуйста определи тип аргумента внутри конструктора: constructor(private name){..} в файле https://github.com/g1er/Andrew/blob/master/typescript/ts/products.ts и закомить.
напомню что можно определить тип переменных как string или любой другой или можно определить как any в этом случае тип может быть любым.
Отвечая на твой вопрос пояснить значение фразы
не может иметь анотацию возвращаемого типа
скажу для начала, что я допустил ошибку в обьяснении.
Я пытался рассказать о типе возвращаемых данных при использовании 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)
Так в итоге для set мы можем указывать тип параметра? В предыдущем пояснении ты писал, что обработчик выдаст ошибку. Или ты в этом тоже ошибся?
Как видешь я привёл выше пример для set
newName : string
set fullName(newName: string) {
if (passcode && passcode == "secret passcode") {
this._fullName = newName;
}
else {
console.log("Error: Unauthorized update of employee!");
}
}
Просьба прочитать еще раз пример выше, попробовать пробилдить на компе (посмотреть если есть ошибки). Попробуй так же в setter поставить тип возвращаемых данных как :void
и прокомпелировать.
Если все пройдет нормально просьба провести соответствующие моим комментариям на PR (https://github.com/g1er/Andrew/pull/26) изменения в коде и повторно запушить , после чего я утвержу PR (pull request).
Напиши если есть вопросы.
Спасибо.
Все, я понял.
Я попробовал поставить :void в сеттер, но VSC стал сразу ругаться Метод доступа set не может иметь заметку с типом возвращаемого значения.
поэтому я даже не компилировал. Просто определил тип параметра в SET.
просьба провести соответствующие моим комментариям на PR (#26) изменения в коде
я перешел по ссылке на PR #26 и если честно никаких комментариев там на обнаружил. может не там смотрел? В итоге я запушил на свой бренч изменения с СЕТом. Если что-то не доделал, дай знать
Начинаем изучать Классы.
Я нашел хорошее описание классов на русском языке с примерами - можно будет туда тоже обращаться: http://typescript-lang.ru/docs/Classes.html Я буду давать по этой ссылке примеры с объяснениями, иногда останавливаясь на некоторых местах подробней.
Итак как и во всех объектно-ориентированных языках в TypeScript есть классы (во многом ты найдешь для себя синтаксис знакомым).
1. Рассмотрим простой пример с конструктором, свойством и методом (пример по выше-указанной ссылке):
Несколько моментов: А) название класса обычно с большой буквы: Greeter Б) свойство greeting имеет тип string и если не определить, то по умолчанию public т.е. тоже самое что и :
Напомню private означает что private метод или private свойство могут быть вызваны только внутри класса (при обращении одного метода к другому private свойству или другому private методу внутри класса) , т.е. к примеру свойство private prefix является private и доступно только внутри метода greet(). В свое время public означает что метод или свойство будут доступны для обращения / вызова внутри нового объекта после создания этого объекта от класса при помощи оператора new, например, после создания greeter:
т.о. можно обратиться к свойству greeter.greeting и методу greeter.greet(). Однако свойство prefix является private поэтому не доступно внутри объекта greeter.prefix, но доступно внутри метода greet(). В) конструктор в нашем случае имеет один параметр message, тип которого определен как string:
Г) внутри фигурных скобок constructor мы присваеваем значение передаваемого параметра свойству greeting:
Т.о. при создании нового объекта от класса Greeter при помощи оператора new, аргумент внутри скобок передется значению свойства greeting:
Д) Далее внутра класса у нас есть public метод greet():
тоже самое
Обращаю внимание что после названия метода greet и скобок () стоит двоеточие и тип string - так обозначается тип данных возвращаемых методом, т.е. в нашем случае метод возвращает тип данных string.