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