web-dev-qa-db-ja.com

多重継承の回避策

複数のインターフェースを1つの抽象クラスに結合するためのパターンを見つけようとしています。現在、implementsを介して複数のインターフェースを組み合わせることができますが、インターフェースはコンストラクターを宣言できません。コンストラクターを導入する必要がある場合、抽象クラスを使用する必要があります。抽象クラスを使用するときは、複合インターフェース全体を再宣言する必要があります。確かに私は何かが欠けていますか?

interface ILayerInfo {
    a: string;
}

interface ILayerStatic {
    b(): string;
}

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

[〜#〜] answer [〜#〜]newを使用:

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

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

インスタンスメンバーと同じインターフェイスでコンストラクターを宣言することは、あまり意味がありません。コンストラクターで使用する型を動的に渡す場合、制限されるのはクラスの静的側です。あなたがしたいことはおそらく次のようなものです:

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);

参照 構成署名を使用したTypeScriptインターフェイスはどのように機能しますか?

25
Ryan Cavanaugh