Ответ 1
Объявление конструктора в том же интерфейсе, что и члены экземпляра, на самом деле не имеет особого смысла - если вы собираетесь динамически использовать тип в конструкторе, это статическая сторона класса, которая будет ограничено. То, что вы хотели бы сделать, вероятно, примерно так:
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 интерфейс с сигнатурами конструирования?