Как разбить класс TypeScript на несколько файлов?

Я нашел множество примеров, а также попытался разбить модуль на несколько файлов. Поэтому я получаю этот, очень удобный. Но также практично иногда разделять класс по той же причине. Скажем, у меня есть несколько методов, и я не хочу перебирать все в один длинный файл.

Я ищу что-то похожее на объявление partial на С#.

Ответ 1

Вы не можете.

Был реализован запрос функции для реализации частичных классов, сначала на CodePlex, а затем на GitHub, но в 2017-04-04 он был объявлен вне сферы видимости. Приводится ряд причин, основной вывод, по-видимому, заключается в том, что они хотят как можно больше избежать отклонения от ES6:

У TypeScript уже слишком много функций класса TS [...] Добавление еще одной функции класса TS - это еще одна солома на верблюде, которую мы должны избегать, если можем. [...] Итак, если есть какой-то сценарий, который действительно выбивает его из парка для добавления частичных классов, то этот сценарий должен быть в состоянии оправдать себя через процесс TC39.

Ответ 2

Я использую это (работает в typescript 2.2.2):

class BigClass implements BigClassPartOne, BigClassPartTwo {
    // only public members are accessible in the
    // class parts!
    constructor(public secret: string) { }

    // this is ugly-ish, but it works!
    methodOne = BigClassPartOne.prototype.methodOne;
    methodTwo = BigClassPartTwo.prototype.methodTwo;
}

class BigClassPartOne {
    methodOne(this: BigClass) {
        return this.methodTwo();
    }
}

class BigClassPartTwo {
    methodTwo(this: BigClass) {
        return this.secret;
    }
}

Ответ 3

В последнее время я использую этот шаблон:

class BigClass {
    public getValue = getValue;
    public setValue = setValue;

    protected value = "a-value";
}

function getValue(this: BigClass) {
    return this.value;
}

function setValue(this: BigClass, value: string ) {
    this.value = value;
}

Часто я перемещаю функции в отдельных файлах, для чистой и масштабируемой настройки!

Ответ 4

Я использую простое подклассирование при преобразовании больших старых многосайтовых javascript-классов, которые используют "прототип" в несколько файлов машинописных файлов:

bigclassbase.ts:

class BigClassBase {
    methodOne() {
        return 1;
    }

}
export { BigClassBase }

bigclass.ts:

import { BigClassBase } from './bigclassbase'

class BigClass extends BigClassBase {
    methodTwo() {
        return 2;
    }
}

Вы можете импортировать BigClass в любой другой файл машинописного текста.

Ответ 5

Похоже, что самый принципиальный способ справиться с этим (в 2018 году) - это использовать TypeScript Mixins

Это позволяет добавлять элементы и методы в класс в другом файле. Это не так удобно, как частичные классы С#, но это похоже на лучший вариант, поддерживаемый языком (по крайней мере, для использования кода).