2013-07-25 11 views
12

私は1つの抽象クラスに複数のインターフェイスを組み合わせるパターンを発見しようとしています。現在、私は "implements"を介して複数のインターフェースを組み合わせることができますが、インターフェースはコンストラクターを宣言できません。コンストラクタを導入する必要があるとき、私は抽象クラスを使用することを余儀なくされます。私が抽象クラスを使用するとき、私は複合インターフェース全体を再宣言する必要があります!確かに私は何かを欠いている?Typescript複数の継承の回避策?

interface ILayerInfo { 
    a: string; 
} 

interface ILayerStatic { 
    b(): string; 
} 

class Layer implements ILayerInfo, ILayerStatic { 
    constructor(info: ILayerInfo); 
    a: string; 
    b(): string; 
} 

ANSWER:使用「新しい」:インスタンスメンバーと同じインターフェイス上のコンストラクタを宣言

interface Layer extends ILayerInfo, ILayerStatic { 
    new(info: ILayerInfo); 
} 

// usage: new Layer({ a: "" }); 

答えて

21

が本当にあまり意味がありません - あなたが渡すつもりならコンストラクタで動的に型を使用すると、クラスの静的な側面が制限されます。

interface Colorable { 
    colorize(c: string): void; 
} 

interface Countable { 
    count: number; 
} 

interface ColorCountable extends Colorable, Countable { 
} 

interface ColorCountableCreator { 
    new(info: {color: string; count: number}): ColorCountable; 
} 

class ColorCounted implements ColorCountable { 
    count: number; 
    colorize(s: string) { } 
    constructor(info: {color: string; count: number}) { 
     // ... 
    } 
} 

function makeThings(c: ColorCountableCreator) { 
    var results: ColorCountable[]; 
    for(var i = 0; i < 10; i++) { 
     results.push(new c({color: 'blue', count: i})); 
    } 
    return results; 
} 

var items = makeThings(ColorCounted); 
console.log(items[0].count); 

も参照してくださいHow does typescript interfaces with construct signatures work?

+0

それは私が行方不明になったインターフェイス上の「新しい」キーワードだった:何をしたいと思うことは、おそらくこのようなものです!私はクラスを全く望んでいませんでした。 "新しい"と私はインターフェイスに固執することができます。 –