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

StackOverflow https://stackoverflow.com//questions/12706290

  •  13-12-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

<Сильные> 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)
   ...
} 
.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top