10

1つのファイルでクラスを宣言し、そのメソッドを別のファイルで定義することは可能ですか?

たくさんのメソッドを持つクラスがいくつかありますが、それらを少し広げることができれば素晴らしいと思います。

4

2 に答える 2

8

簡単な答え: Typescriptは、クラス定義を複数のファイルに分割することをサポートしていません。

回避策:クラスのメンバーを含むインターフェイスと、そのインターフェイスを実装する2つの異なるクラスを定義できます。次に、あるクラスから別のクラスにプロパティをミックスインして、結合されたクラスを作成します。例えば:

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

ただし、クラスのコンストラクターが必要な場合、これは機能しません。そして実際にはそれは最適ではありません...それでも回避策:)

ちなみに、これは、typescriptがクラスの単一化されたプロパティ/フィールド型宣言を出力しないために機能します-型チェックにのみ使用します。

また、インターフェイスなしでこれを実行でき、クラス構成だけをよりきれいな方法で実行できることも理解しています...これを実行する方法は、今のところ読者に演習として任せます...

于 2012-10-03T10:38:59.017 に答える
6

クラス自体以外のファイルから関数をインポートできます

クラスファイルの例を次に示します。

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

1つの関数ファイルの例を次に示します。

import {MyClass} from "./MyClass"

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

重要な注意:矢印関数でbind(this)を実行できないため、エクスポートされたすべての関数が矢印関数ではないことを確認してください

于 2019-10-19T00:57:25.597 に答える