Transcrito:definir a classe e seus métodos em arquivos separados
-
13-12-2019 - |
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.
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