TypeScript インターフェースプロパティの型を「抽出」する方法はありますか? 質問する

TypeScript インターフェースプロパティの型を「抽出」する方法はありますか? 質問する

いくつかのインターフェースを含むライブラリ X の型指定ファイルがあるとします。

interface I1 {
    x: any;
}
    
interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

このライブラリを使用するには、 とまったく同じ型のオブジェクトを渡す必要がありますI2.y。もちろん、ソース ファイル内に同一のインターフェイスを作成することもできます。

interface MyInterface {
    a: I1,
    b: I1,
    c: I1
}

let myVar: MyInterface;

しかし、ライブラリのものを最新の状態に保つという負担がかかり、さらに、コードが非常に大きくなり、多くのコードが重複する可能性があります。

したがって、インターフェースのこの特定のプロパティの型を「抽出」する方法はありますか? これに似たものlet myVar: typeof I2.y(これは機能せず、「名前 I2 が見つかりません」というエラーが発生します)。


編集: TS Playground で少し遊んだ後、次のコードがまさに私が望んでいることを実現することに気付きました:

declare var x: I2;
let y: typeof x.y;

ただし、冗長な変数xを宣言する必要があります。その宣言なしでこれを実現する方法を探しています。

ベストアンサー1

以前は不可能だったが、幸運にも今は可能だ。TypeScript バージョン 2.12016 年 12 月 7 日にリリースされ、インデックス アクセス タイプ(ルックアップ タイプとも呼ばれます)が導入されました。

構文は要素アクセスのように見えますが、型の代わりに記述されます。つまり、あなたの場合は次のようになります。

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

let myVar: I2['y'];  // indexed access type

現在はmyVarのタイプになっていますI2.y

チェックしてみてTypeScript プレイグラウンド

おすすめ記事