2017-06-29 11 views
1

クラスコードを改良するために、Typescriptを使ってクラス・デコレータをmixinsとして使用するのがよいと思っています。this質問は私が探しているものですが、 'Not Possible 「私はハックし始めた。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でそれを行う方法ですか?

答えて

0

tl; dr 悲しいことに私はそうは思わない。

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

ミックスインダンスを実行すると、インターフェイスが引き継がれます。

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

ただし、次のコードでは表示されません。

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

私にとってこれはバグであり、すぐに修正していただきたいと思います。

関連する問題