【问题标题】:Typescript class decorators as MixinsTypescript 类装饰器作为 Mixins
【发布时间】:2017-06-29 12:49:50
【问题描述】:

我希望改进一些代码,我认为这些代码很好地代表了将类装饰器用作 Typescript 的 mixin this 问题正是我正在寻找的,但我开始使用“不可能”的解决方案黑客攻击。

结果就是这个工作代码

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 中做到这一点?

【问题讨论】:

    标签: typescript decorator


    【解决方案1】:

    tl;博士 遗憾的是,我不这么认为。

    在我的 util lib 中,我也遇到了同样的问题,即 Poolable mixin 也实现了 IPoolable。

    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);
            }
        };
    }
    

    然后做 mixin 舞蹈,它可以工作,传递接口。

    class Base {}
    class Obj extends Poolable(Base) {}
    let pool = new Pool(Obj);
    

    但下面的代码没有。

    @Poolable
    class Base {}
    const pool = new Pool(Base);
    

    对我来说这是一个错误,我希望他们尽快修复它。

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 2017-11-15
      • 2019-02-20
      • 2018-04-07
      • 2021-07-16
      • 1970-01-01
      • 2019-01-07
      • 2022-08-15
      • 1970-01-01
      相关资源
      最近更新 更多