2017-03-29 19 views
4

TypeScriptでES6ミックスインを使用しようとしています。私が持っているものは以下の通りで、BaseClassで完璧に動作します。ES6 TypeScriptのジェネリック型のミックスイン

class BaseClass { 
    public foo() {} 
}; 

interface IMyMixin { 
    foo2(); 
} 

let MyMixin = (superclass: typeof BaseClass) => class extends BaseClass implements IMyMixin { 
    public foo2() {} 
} 

class MyBaseClass extends MyMixin(BaseClass) { 

} 

しかし、私はBaseClassから派生したクラスにMyMixinを適用することはできません。一方、ミックスインも一般的にすることはできません。

BaseClassDerivedClassの両方で動作させる方法はありますか?

class DerivedClass extends BaseClass { 
    public bar() {} 
} 

class MyDerivedClass extends MyMixin(DerivedClass) { 
    public something() { 
// Compile Error: Property 'bar' does not exist on type 'MyDerivedClass' 
     this.bar(); 
    } 
} 

// Compile Error: 'T' only refers to a type, but is being used as a value here. 
let MyMixin = <T extends BaseClass>(superclass: typeof T) => class extends T implements IMyMixin { 
    public foo2() {} 
} 
+0

あなたは 'class extends BaseClass implements IMyMixin'の代わりに' class extends superclass implements IMyMixin'を書こうとしましたか?さもなければ、 'superclass'変数が' MyMixin'ファクトリ関数で使われていません –

+0

@ Maximusありがとう、私は 'superclass'が戻り値の型で使われることを知りませんでした。 – Haocheng

答えて

1

TypeScript/PR#13743から解決策を見つけ、@ Maximusのコメントで最適化しました。

このコードは機能します。その理由は、MyMixinではTはタイプではなく、Class(つまりコンストラクタ)である必要があります。

type Constructor<T> = new (...args: any[]) => T; 

class BaseClass { 
    public foo() { } 
}; 

interface IMyMixin { 
    foo2(); 
} 

// `implements IMyMixin` is optional. 
let MyMixin = <T extends Constructor<BaseClass>>(superclass: T) => class extends superclass implements IMyMixin { 
    public foo2() { } 
} 

class DerivedClass extends BaseClass { 
    public bar() {} 
} 

class MyDerivedClass extends MyMixin(DerivedClass) { 
    public something() { 
     this.bar(); 
     this.foo(); 
     this.foo2(); 
    } 
} 
関連する問題