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