del example
This commit is contained in:
parent
6059ff4ed2
commit
9ac2fd8f44
@ -1,44 +0,0 @@
|
|||||||
type DecoratorFunc = (target: any, key: string, descriptor: PropertyDescriptor) => void;
|
|
||||||
|
|
||||||
const createDecorator = (decorator: DecoratorFunc) => (Model: any, key: string) => {
|
|
||||||
const target = Model.prototype;
|
|
||||||
const descriptor = Object.getOwnPropertyDescriptor(target, key);
|
|
||||||
decorator(target, key, descriptor);
|
|
||||||
};
|
|
||||||
|
|
||||||
const logger: DecoratorFunc = (target, key, descriptor) =>
|
|
||||||
Object.defineProperty(target, key, {
|
|
||||||
...descriptor,
|
|
||||||
value: async (...args: any[]) => {
|
|
||||||
try {
|
|
||||||
return descriptor.value.apply(this, args);
|
|
||||||
} finally {
|
|
||||||
const now = new Date().valueOf();
|
|
||||||
console.log(`lasted logged in ${now}`);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
class User {
|
|
||||||
async login() {
|
|
||||||
console.log('login success');
|
|
||||||
await new Promise((resolve) => {
|
|
||||||
setTimeout(resolve, 100);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const exp1 = () => {
|
|
||||||
console.log();
|
|
||||||
console.log(
|
|
||||||
'-----------------------示例1:高阶函数柯里化(装饰器内部原理)-----------------------',
|
|
||||||
);
|
|
||||||
console.log('-----------------------实现登录和日志记录解耦-----------------------');
|
|
||||||
console.log();
|
|
||||||
const loggerDecorator = createDecorator(logger);
|
|
||||||
loggerDecorator(User, 'login');
|
|
||||||
const user = new User();
|
|
||||||
user.login();
|
|
||||||
console.log();
|
|
||||||
console.log('-----------------------示例1:执行完毕-----------------------');
|
|
||||||
};
|
|
@ -1,33 +0,0 @@
|
|||||||
const HelloDecorator = <T extends new (...args: any[]) => any>(constructor: T) => {
|
|
||||||
return class extends constructor {
|
|
||||||
newProperty = 'new property';
|
|
||||||
hello = 'override';
|
|
||||||
|
|
||||||
sayHello() {
|
|
||||||
return this.hello;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
@HelloDecorator
|
|
||||||
export class Hello {
|
|
||||||
[key: string]: any;
|
|
||||||
|
|
||||||
hello: string;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.hello = 'test';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const exp2 = () => {
|
|
||||||
console.log('-----------------------示例2:简单的类装饰器-----------------------');
|
|
||||||
console.log(
|
|
||||||
'-----------------------动态添加一个sayHello方法以及覆盖hello的值-----------------------',
|
|
||||||
);
|
|
||||||
console.log();
|
|
||||||
const hello = new Hello();
|
|
||||||
console.log(hello.sayHello());
|
|
||||||
console.log();
|
|
||||||
console.log('-----------------------示例2:执行完毕-----------------------');
|
|
||||||
};
|
|
@ -1,30 +0,0 @@
|
|||||||
const SetNameDecorator = (firstName: string, lastName: string) => {
|
|
||||||
const name = `${firstName}.${lastName}`;
|
|
||||||
return <T extends new (...args: any[]) => any>(target: T) => {
|
|
||||||
return class extends target {
|
|
||||||
_name: string = name;
|
|
||||||
|
|
||||||
getMyName() {
|
|
||||||
return this._name;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
@SetNameDecorator('ray', 'liuyi')
|
|
||||||
class UserService {
|
|
||||||
[key: string]: any;
|
|
||||||
|
|
||||||
c() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const exp3 = () => {
|
|
||||||
console.log();
|
|
||||||
console.log('-----------------------示例3:装饰器工厂-----------------------');
|
|
||||||
console.log('-----------------------通过继承方式 重载getName方法-----------------------');
|
|
||||||
console.log();
|
|
||||||
const user = new UserService();
|
|
||||||
console.log(user.getMyName());
|
|
||||||
console.log();
|
|
||||||
console.log('-----------------------示例3:执行完毕-----------------------');
|
|
||||||
};
|
|
Loading…
Reference in New Issue
Block a user