Domanda

È possibile dichiarare una classe in un file e definire i suoi metodi in file separati?

Ho alcune classi con molto di metodi e sarebbe bello se potessi diffonderli un po '.

È stato utile?

Soluzione

Risposta breve: dattilografo non supporta la suddivisione di una definizione di classe in diversi file.

Workaround : è possibile definire un'interfaccia contenente membri per la classe e due classi diverse che implementano quell'interfaccia. Quindi mescolare le proprietà da una classe all'altra, per creare una classe combinata. Ad esempio:

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

Questo non funzionerà se hai bisogno di costruttori per la classe, però. E davvero è subordimale ... Sovrabound Nessuno Meno:)

Oh, a proposito, funziona perché dattilografo non emette dichiarazioni di tipo di proprietà / campo unizializzato per le classi - li utilizza solo per il controllo del tipo.

Mi rendo inoltre conto che puoi farlo senza interfacce e solo la costruzione della classe in un modo più carino ... lascerò come farlo come esercizio ai lettori per ora ...

Altri suggerimenti

È possibile importare le funzioni da altri file rispetto alla classe stessa

Ecco l'esempio del file di 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)
}
.

Ecco l'esempio di un file di funzione:

import {MyClass} from "./MyClass"

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

Nota importante: Assicurarsi che ogni funzione esportata non sia una funzione di freccia perché non puoi eseguire il legame (questo) su una funzione freccia

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top