Pergunta

É possível declarar uma classe em um arquivo e definir seus métodos em arquivos separados?

Eu tenho algumas aulas com um monte de métodos e seria ótimo se eu pudesse espalhar-los um pouco.

Foi útil?

Solução

Resposta curta: O Typescript não suporta dividir uma definição de classe em vários arquivos.

Solução alternativa:Você pode definir uma interface que contém membros para a classe, e em duas diferentes classes de implementação para essa interface.Em seguida, mixin de propriedades de uma classe para a outra, para fazer um combinado de classe.Por exemplo:

LargeClass.um.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
}

O uso.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];
}

Isto não vai funcionar se você precisa de construtores para a classe, no entanto.E realmente é de qualidade inferior...Solução nenhum a menos :)

Ah, a propósito, isso funciona porque o typescript não emitir unitialised propriedade/campo tipo de declarações de classes--ele apenas usa-los para a verificação de tipo.

Eu também perceber que você pode fazer isso sem interfaces e apenas a classe de construir, de uma maneira mais bonita...Vou deixar como fazer isso como um exercício para leitores de agora...

Outras dicas

você pode importar suas funções a partir de outros arquivos do que a própria classe

aqui está o exemplo de arquivo de classe:

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)
}

Aqui está o exemplo de um arquivo de função:

import {MyClass} from "./MyClass"

export function func1(this: MyClass, param1: any, param2: any){
   console.log(this.foo)
   ...
} 

Nota importante: certifique-se de que cada função exportada não é uma seta de função, porque você não pode fazer bind(este) em uma seta de função

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top