繁体   English   中英

Typescript类装饰器作为Mixins

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM