いくつかのインターフェースを含むライブラリ 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 プレイグラウンド。