Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,131 changes: 1,131 additions & 0 deletions dist/Reflect.js

Large diffs are not rendered by default.

47 changes: 47 additions & 0 deletions dist/task_1/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/** Задача 1
* 1) Изучить принцип работы паттерна декоратор (https://refactoring.guru/ru/design-patterns/decorator)
* 2) Для метода exec класса Calculator реализовать два классических декоратора:
* 2.1) DecorateRu - Оборачивает работу метода exec и выводит
* результат в виде строки на русском языке:
* результат сложения ${a} + ${b} = ${рассчитанное значение}
* 2.2) DecorateEn - Оборачивает работу метода exec и выводит
* результат в виде строки на английском языке:
* result of the addition operation ${a} + ${b} = ${рассчитанное значение}
*/
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
function DecorateRu(target, method, descriptor) {
let originalMethod = descriptor.value;
descriptor.value = function (...args) {
let returnValue = originalMethod.apply(this, args);
return `результат сложения ${args[0]} + ${args[1]} = ${returnValue}`;
};
}
class Calculator {
constructor(a, b) {
this.a = 0;
this.b = 0;
if (!!a) {
this.a = a;
}
if (!!b) {
this.b = b;
}
}
exec() {
return (this.a + this.b).toString();
}
}
__decorate([
DecorateRu,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", String)
], Calculator.prototype, "exec", null);
57 changes: 57 additions & 0 deletions dist/task_2/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/** Задача 1
* Реализовать декоратор, используя встроенную поддержку декораторов в TypeScript,
* который будет реагировать на присвоение в поле email значения.
* Когда присваивается корректный e-mail в консоль выводится сообщение email valid.
* Когда присваивается некорректный e-mail возбуждается ошибка.
*/
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
function validateEmail(email) {
let re = /\S+@\S+\.\S+/;
return re.test(email);
}
function decorator(target, propertyKey) {
let _val = this[propertyKey];
let getter = function () {
return _val;
};
// сеттер
let setter = function (newVal) {
try {
if (validateEmail(newVal)) {
_val = newVal;
}
else {
throw new Error('not valid');
}
}
catch (e) {
console.log("Error: " + e.message);
}
};
if (delete this[propertyKey]) {
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter
});
}
}
class Example {
constructor() {
this.email = "";
}
}
__decorate([
decorator,
__metadata("design:type", String)
], Example.prototype, "email", void 0);
let exampleInstance = new Example();
exampleInstance.email = "fkkldfjg"; // генерирует эксепшен
exampleInstance.email = "misha@mail.ru"; // выводит в консоль e-mail valid
60 changes: 60 additions & 0 deletions dist/task_3/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/** Задача 3
* Ниже представлен код в котором, пропущены участки кода.
* Требуется дописать участки кода так, чтобы программа компилировалась.
* Использование типа any допустимо только в Control<any>.
* Переопределенные методы getValue и setValue в классах TextBox и SelectBox должны
* принимать и возвращать только свой результирующий тип (string и SelectItem)
* Методы register и getInstance класса FactoryControl. Должны принимать и возвращать только те типы,
* которые унаследованы от класса Control<T>.
*/
/**Базовый класс для контролов */
class Control {
constructor() {
this.name = "";
}
}
/**Класс описывает TextBox контрол */
class TextBox extends Control {
getValue() {
return this.value;
}
setValue(val) {
this.value = val;
}
}
/**value контрола selectBox */
class SelectItem {
}
/**Класс описывает SelectBox контрол */
class SelectBox extends Control {
getValue() {
return this.value;
}
setValue(val) {
this.value = val;
}
}
class Container {
}
/**Фабрика которая отвечает за создание экземпляров контролов */
class FactoryControl {
constructor() {
this._collection = [];
}
register(type) {
if (!this.existType(typeof type)) {
this._collection.push({ instance: type, type: typeof type });
}
}
getInstance(type) {
return this._collection.find(item => item.instance === type.prototype).instance;
}
existType(type) {
return this._collection.filter(g => g.type === type).length > 0;
}
}
const factory = new FactoryControl();
factory.register(SelectBox);
const selectBoxInstance = factory.getInstance(SelectBox);
// selectBoxInstance.setValue("sdfsdf") // компилятор TS не пропускает
// selectBoxInstance.setValue(new SelectItem()) // компилятор TS пропускает
12 changes: 12 additions & 0 deletions dist/task_4/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/** Задача 4
* Описать каким должен быть объект X, чтобы метод работал корректно
*/
function getProperty(obj, key) {
return obj[key];
}
const x = {
manufacturer: "Toyota",
m: "Camry",
year: 2014,
};
console.log(getProperty(x, "m"));
48 changes: 48 additions & 0 deletions dist/task_5/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
/** Задача 5
* Реализовать декоратор с шаблонным типом, который добавляется к полю класса.
* Декоратор должен выполнять 2 функции:
* 1) Проверять соответствие устанавливаемого значения типу, который передан в декоратор.
* Если тип не верный, то генерируется эксепшен.
* 2) Проверять у передаваемого объекта наличие заполненного поля.
* Если поле не заполнено, то генерируется эксепшен.
*/
import 'reflect-metadata';
function validate(ValueExample, param) {
let newClass = new ValueExample1();
return function (target, propertyName) {
// to get the design type of the property from the object
var t = Reflect.getMetadata("design:type", target, propertyName);
console.log(`${propertyName} type: ${t.name}`); // name type: String
};
}
class ValueExample1 {
constructor(value, id) {
this.value = value;
this.id = id;
}
}
class ValueExample2 {
constructor(undefinedProp, booleanProp) {
this.undefinedProp = undefinedProp;
this.booleanProp = booleanProp;
}
}
class Exampl {
}
__decorate([
validate(ValueExample1, "id"),
__metadata("design:type", Object)
], Exampl.prototype, "propValueExample1", void 0);
__decorate([
validate(ValueExample2, "booleanProp"),
__metadata("design:type", Object)
], Exampl.prototype, "propValueExample2", void 0);
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,7 @@
"dependencies": {
"tsc": "^1.20150623.0"
},
"devDependencies": {}
"devDependencies": {
"reflect-metadata": "^0.1.13"
}
}
11 changes: 10 additions & 1 deletion src/task_1/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@
* result of the addition operation ${a} + ${b} = ${рассчитанное значение}
*/

function DecorateRu(target: Object, method: string, descriptor: PropertyDescriptor) {
let originalMethod = descriptor.value;
descriptor.value = function(...args) {
let returnValue = originalMethod.apply(this, args)
return `результат сложения ${args[0]} + ${args[1]} = ${returnValue}`
}
}

class Calculator {
protected a: number = 0;
protected b: number = 0;
Expand All @@ -21,7 +29,8 @@ class Calculator {
this.b = b;
}
}


@DecorateRu
public exec(): string {
return (this.a + this.b).toString();
}
Expand Down
35 changes: 35 additions & 0 deletions src/task_2/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,45 @@
* Когда присваивается некорректный e-mail возбуждается ошибка.
*/

function validateEmail(email: string): boolean {
let re = /\S+@\S+\.\S+/;
return re.test(email);
}

function decorator(target: Object, propertyKey: string): any {

let _val = this[propertyKey]
let getter = function (): string {
return _val;
};

// сеттер
let setter = function (newVal: string): void {
try {
if (validateEmail(newVal)) {
_val = newVal;
} else {
throw new Error('not valid')
}
} catch (e) {
console.log("Error: " + e.message);

}
};
if (delete this[propertyKey]) {
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter
});
}
}

class Example {
@decorator
public email: string = "";
}

let exampleInstance = new Example();

exampleInstance.email = "fkkldfjg"; // генерирует эксепшен
exampleInstance.email = "misha@mail.ru"; // выводит в консоль e-mail valid
26 changes: 21 additions & 5 deletions src/task_3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ abstract class Control<T> {
}
/**Класс описывает TextBox контрол */
class TextBox extends Control<string> {
public getValue(): string {
return this.value
}
public setValue(val: string): void {
this.value = val
}
}
/**value контрола selectBox */
class SelectItem {
Expand All @@ -29,6 +35,12 @@ class SelectItem {

/**Класс описывает SelectBox контрол */
class SelectBox extends Control<SelectItem> {
public getValue(): SelectItem {
return this.value
}
public setValue(val: SelectItem): void {
this.value = val
}
}

class Container {
Expand All @@ -45,13 +57,17 @@ class FactoryControl {
this._collection = [];
}

public register<?>(type: ?) {
public register<T extends typeof SelectBox>(type: T) {
if(!this.existType(typeof type)) {
this._collection.push({instance: type, type: typeof type})
}
}

public getInstance<?>(type: ?): ? {
public getInstance<T extends typeof SelectBox>(type: T): Control<T> {
return this._collection.find(item => item.instance === type.prototype).instance
}

private existType(type: string) {
private existType(type: string): boolean {
return this._collection.filter(g => g.type === type).length > 0;
}
}
Expand All @@ -61,5 +77,5 @@ factory.register(SelectBox);

const selectBoxInstance = factory.getInstance(SelectBox);

selectBoxInstance.setValue("sdfsdf") // компилятор TS не пропускает
selectBoxInstance.setValue(new SelectItem()) // компилятор TS пропускает
// selectBoxInstance.setValue("sdfsdf") // компилятор TS не пропускает
// selectBoxInstance.setValue(new SelectItem()) // компилятор TS пропускает
7 changes: 6 additions & 1 deletion src/task_4/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}

const x = undefined;
const x = {
manufacturer: "Toyota",
m: "Camry",
year: 2014,
};


console.log(getProperty(x, "m"));
Loading