web-dev-qa-db-ja.com

TypeScript-宣言とエクスポート-ベストプラクティス?

短くて甘いですが、declareまたはexportを使用して独自のインターフェイスを定義することをお勧めしますか?

// i.something.d.ts
export default interface ISomething {
    myValue: string;
} 

// something.ts
import ISomething from 'i.something';

export class Something implements ISomething {...}

vs.

// i.something.d.ts
declare interface ISomething {
    myValue: string;
} 

// something.ts
export class Something implements ISomething {...}

もちろん、独自の別のタイプをインポートする必要がある場合、declareでさえ周囲的に機能しません。 (それを行うためのより良い方法がない限り)

// i.something-else.d.ts
import SomeBiggerThing from '...';
import SomeKindOfType from '...';

declare interface ISomethingElse extends SomeBiggerThing {
    myValue: SomeKindOfType;
} 

// something-else.ts
// ISomethingElse isn't available unless I import it, because it imports its own stuff.
import ISomethingElse from 'i.something-else';

export class Something implements ISomethingElse {...}
11
user358089

ほとんどの大規模/成熟したTypeScriptライブラリは、アンビエント宣言に依存することを避け、代わりに現在のファイルの外部で再利用する必要があるものをexportします。たとえば、Angularコードベースにはinterfaces.tsインターフェースを参照する必要がある各ファイルにインポートされる各モジュールのファイル:

https://github.com/angular/angular/blob/master/packages/http/src/interfaces.ts

これにはいくつかの利点があります。

  • ファイルで使用されるすべてのタイプは、ファイルの先頭にあるimportステートメントを介して明示的に参照されます。
  • モジュールのインターフェースをエクスポートして、モジュールのコンシューマーが利用できるようにする方が簡単です。アンビエントインターフェイスをエクスポートするには、モジュールのメインファイルでインターフェイスを直接定義する必要があります(モジュールからエクスポートできるのはローカル宣言のみです)。
  • それはもっとJavaScript-yです。最新のJavaScriptはimportおよびexportステートメントに依存していますが、アンビエントタイプのコンテキストはTypeScriptのみの概念です。
3
Nathan Friend