Типрипечатка: определить класс и его методы в отдельных файлах
-
13-12-2019 - |
Вопрос
Можно ли объявить класс в одном файле и определить его методы в отдельных файлах?
У меня есть несколько классов с
Решение
<Сильный> Обходной путь : Вы можете определить интерфейс, содержащий элементы для класса, и два разных класса, реализующие этот интерфейс. Затем смешивайте свойства из одного класса к другому, чтобы сделать комбинированный класс. Например:
<Сильные> LargeClass.a.ts
interface LargeClass {
methodA(): string;
methodB(): string;
}
class LargeA implements LargeClass {
methodA: () => string; // not implemented, needed since otherwise we don't extend LargeClass
methodB() {
return "Hello world";
}
}
.
largeclass.b.ts
class LargeB implements LargeClass {
methodA() {
return "Foo";
}
methodB: () => string; // not implemented, needed since otherwise we don't extend LargeClass
}
.
<Сильные> Использование
// Using underscore's extend to copy implementation from A to B
var c:LargeClass = _.extend(new LargeA(), new LargeB());
// Manually mixing in a to b
var a = new LargeA();
var b:LargeClass = new LargeB();
for (var prop in a) {
b[prop]=a[prop];
}
.
Это не будет работать, если вам нужны конструкторы для класса. И действительно это неоптимально ... Оборудование не тем меньше :)
О, кстати, это работает, потому что Typearctry не выделяет единичные объявления в классах, использует их только для проверки типа.
Я также понимаю, что вы можете сделать это без интерфейсов и просто конструировать класс в более красивее ... Я оставлю, как это сделать как упражнение для читателей ...
Другие советы
Вы можете импортировать свои функции из других файлов, чем сам класс
Вот пример файла класса:
import {func1, func2, func3} from "./functions"
class MyClass {
public foo: string = "bar"
public func1 = func1.bind(this)
public func2 = func2.bind(this)
public func3 = func3.bind(this)
}
.
Вот пример одного функционального файла:
import {MyClass} from "./MyClass"
export function func1(this: MyClass, param1: any, param2: any){
console.log(this.foo)
...
}
.