簡體   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