Машинопись: определить класс и его методы в отдельных файлах

голоса
4

Можно ли объявить класс в одном файле и определить его методы в отдельных файлах?

У меня есть несколько классов с большим методов и было бы здорово , если бы я мог распространять их немного.

Задан 03/10/2012 в 11:10
источник пользователем
На других языках...                            


1 ответов

голоса
6

Короткий ответ: Машинопись не поддерживает разделение на определение класса на несколько файлов.

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

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
}

Usage.ts

// 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];
}

Это не будет работать, если вам нужно конструкторы для класса, хотя. И на самом деле это не неоптимальный ... Обходной путь не менее :)

О, кстати, это работает, потому что машинописные не выделяют заявления unitialised типа недвижимости / поля для классов - он использует их только для проверки типов.

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

Ответил 03/10/2012 в 11:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more