1. ホーム
  2. javascript

TypeScriptのアノテーションで、複数の型のメンバーを組み合わせることは可能か?

2023-12-14 06:23:18

質問

私がやろうとしていることは不可能なようですが、本当にそうであってほしいのです。

本質的に、私は2つのインターフェースを持っており、私はそれらの両方の組み合わせとして単一の関数パラメータをアノテートしたいと思います。

interface ClientRequest {
    userId:     number
    sessionKey: string
}

interface Coords {
    lat:  number
    long: number
}

そして、関数の中で、次のようなことをしたいと思います。

function(data: ClientRequest&Coords) { ... }

私の'data'オブジェクトが両方のタイプのメンバーすべてを含むことができるようにするためです。

で参照されるものを見たのですが 仕様のプレビュー の下で参照されているものを見ましたが、これはまだ含まれていないようです。

それが可能でない場合、私の解決策は次のようになるかもしれません。

interface ClientRequest<T> {
    userId:     number
    sessionKey: string
    data?:       T
}

function(data: ClientRequest<Coords>) { ... }

これは、私が望むほどダイナミックではありませんが、このケースでは動作するでしょう。私は本当に注釈自体で複数の(2つ以上の)タイプを組み合わせることができるようにしたいと思います。

function(data: TypeA&TypeB&TypeC) { ... }

従来の解決策は、これらの型を拡張する型を定義することだと思いますが、それだと柔軟性に欠けるように思います。もし型を追加したい場合は、以下のどちらかを行わなければなりません。

  • (a) 宣言に戻って書き直す、または
  • (b) まったく新しいインターフェイスを作成する。余分なオーバーヘッドに同意するかどうかはわかりません。

TypeScriptのエキスパートがいたら、正しい方向性を示してくれるだろうか?

どのように解決するのですか?

ご質問に対する具体的な答えは、「いいえ、複合型や拡張型を示すインライン注釈は1つもありません」です。

あなたが解決しようとしている問題のベストプラクティスは、他の2つを拡張する3番目の型を作成することでしょう。

interface IClientRequestAndCoords extends IClientRequest, ICoords {} 

function(data: IClientRequestAndCoords) 

アップデイト 2018-10-30

TypeScriptにタイプインターセクションが追加されました。なので、単純にできるようになりました。

interface ClientRequest {
  userId:     number
  sessionKey: string
}

interface Coords {
  lat:  number
  long: number
}

function log(data: ClientRequest & Coords) { 
  console.log(
    data.userId,
    data.sessionKey,
    data.lat,
    data.long
  );
}