1. ホーム
  2. タイプスクリプト

[解決済み】TypeScriptのインターフェイスプロパティの型を "抽出 "する方法はあるのか?

2022-04-09 11:56:04

質問

いくつかのインタフェースを含むライブラリ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 (これはうまくいかず、"Cannot find name I2"というエラーになります).


編集 TS プレイグラウンドで少し遊んだ後、次のコードがまさに私が望むことを実現することに気づきました。

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

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

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

以前は不可能でしたが、幸運にも今は可能です。 TypeScriptバージョン2.1 . 2016年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プレイグラウンド .