[英]Typescript class decorators as Mixins
我正在尝试改进一些代码,这些代码可以很好地表示使用Type装饰器作为Typescript的mixins来使用该问题,而这正是我在寻找的问题,但是有了“不可能”的解决方案,我就开始学习了。
结果就是这个工作代码
declare type Constructor<T = {}> = new(...args: any[]) => T
//Permissions function runs when @Permissions is placed as a class decorator
export function Permissions<TBase extends Constructor>(Base:TBase) {
return class extends Base {
read: boolean = false;
edit: boolean = false;
admin: boolean = false;
constructor(...args: any[]) {
super(...args);
this.read = false;
this.edit = false;
this.admin = false;
}
isRead(): boolean {
return this.read;
}
isEdit(): boolean {
return this.edit;
}
isAdmin(): boolean {
return this.admin;
}
setRead(value: boolean): void {
this.read = value;
}
setEdit(value: boolean): void {
this.edit = value;
}
setAdmin(value: boolean): void {
this.read = value
this.edit = value
this.admin = value
}
}
}
// Interface to provide TypeScript types to the object Object
export interface IPermissions {
read: boolean;
edit: boolean;
admin: boolean;
constructor(...args: any[]);
isRead(): boolean;
isEdit(): boolean;
isAdmin(): boolean
setRead(value: boolean): void
setEdit(value: boolean): void
setAdmin(value: boolean): void
}
//Extends the User Object with properties and methods for Permissions
interface User extends IPermissions {}
//Class Decorator
@Permissions
class User {
name: string;
constructor(name: string, ...args: any[]) {
this.name = name;
}
}
// Example instantiation.
let user = new User("Nic")
user.setAdmin(true);
console.log(user.name + ": has these Permissions; Read: " + user.isRead() + " Edit: " + user.isEdit() + " Admin: " + user.isAdmin())
我必须与接口有关的问题。 我想从Permissions函数动态创建接口定义。 这样,我真正需要做的就是修改权限功能,以便在用户对象中获取正确的类型。
有没有办法在TypeScript中做到这一点?
tl;博士在撰写本文时可悲,我不这么认为。
在我的util lib中,我也遇到了同样实现IPoolable的Poolable mixin问题。
export function Poolable<T extends Constructor>(Base: T): T & ICtor<IPoolable> {
return class extends Base implements IPoolable {
public __pool__: Pool<this>;
public release() {
this.__pool__.release(this);
}
public initPool(pool: Pool<this>): void {
this.__pool__ = pool;
}
constructor(...args: any[]) {
super(...args);
}
};
}
进行混合舞蹈时,它可以正常工作,并传递接口。
class Base {}
class Obj extends Poolable(Base) {}
let pool = new Pool(Obj);
但是以下代码没有。
@Poolable
class Base {}
const pool = new Pool(Base);
对我来说,这是一个错误,希望他们尽快修复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.