Подтвердить что ты не робот

Typescript множественные обходные методы наследования?

Я пытаюсь открыть шаблон для объединения нескольких интерфейсов в один абстрактный класс. В настоящее время я могу объединить несколько интерфейсов через "инструменты", но интерфейс не может объявить конструктор. Когда я должен ввести конструктор, я вынужден использовать абстрактный класс. Когда я использую абстрактный класс, я должен повторно объявить весь составной интерфейс! Неужели я что-то упустил?

interface ILayerInfo {
    a: string;
}

interface ILayerStatic {
    b(): string;
}

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

ОТВЕТ: используйте 'new':

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

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

Ответ 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 интерфейс с сигнатурами конструирования?