2016-03-30 14 views
13

いくつかのインターフェースを含むライブラリXのためのタイプファイルがあるとしましょう。TypeScriptインターフェイスのプロパティの種類を「抽出する」方法はありますか?

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; 

をその後私はさらにそれが非常に大きくなる可能性が、ライブラリーからの1と日付にそれを維持する負担を取得し、コードの重複の多くにつながる:私はもちろん、私のソースファイルで同じインターフェイスを作成することができます。

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


編集

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

それが宣言される冗長な変数xが必要ですしかし:TS遊び場にビットを再生した後、私は次のコードは、私がしたい正確に何を達成していることに気づきました。私はその宣言なしでこれを達成する方法を探しています。

+1

*うまくいかない* - どうやって表示されますか?実際に表示されるエラーメッセージは何ですか? –

+0

@BartekBanachewiczが –

答えて

23

それがpoませんでした今まではTypeScript version 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 

は今myVarI2.yの種類があります。

TypeScript Playgroundでご覧ください。

+0

'y'が配列の場合、要素の型を抽出する方法はありますか?例えば配列インデックスはオブジェクトのプロパティと似ているので、まったく同じ方法でそれを行うことができます。I2 {y:{..} []} –

+0

@ JohnBこちらをご覧ください:http://www.typescriptlang.org/play/#src=let%20x%3A%20Array%3Cnumber%3E%20%3D%20%5B%5D%3B%0D%0Alet%20y% 20%20%20%20%20%20%20%22%20%20%20%20%20%20%20%20%%20%%20%%20%%20%%20%%20%%20%%20%%20%%20%%20% 0Alet%20x1%3A%20%5Bstring%2C%20Boolean%2C%20Number%5D%3B%0D%0Alet%20y1%3A%20typeof%20x1%5B1%5D%3B%20%2F%2Fy1%20is%20of% 20type%20boolean –

+0

@ JohnBはい、同じ方法でアクセスできます。 'I2 ['y'] [0]'参照:http://www.typescriptlang.org/play/index.html#src=interface%20I1%20%7B%0D%0A%20%20%20%20x %3A%20A%%3A%20A%%3A%20A%%3A%20A%20%%3A%20A%%3A%20A% 20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%30%20%20%20%20%20%20%20%20% 0D%0Aconsole.log(myVar.x)%3B%0D%0A –

0

インターフェイスはオブジェクトの定義に似ています。次に、yはあなたのI2オブジェクトのプロパティです。その場合は特定の型です。その場合は「匿名」です。

あなたがファイルにあなたのインターフェースを入れて、あなたが他のファイルでそれをインポートすることができますので、エキスを使用することができます
interface ytype { 
    a: I1; 
    b: I1; 
    c: I1; 
} 

interface I2 { 
    y: ytype; 
    z: any; 
} 

Y定義するために別のインタフェースを使用して、このようなあなたのY型としてそれを使用することができ

プロジェクト

export interface ytype { 
    a: I1; 
    b: I1; 
    c: I1; 
} 



export interface I2 { 
     y: ytype; 
     z: any; 
    } 

あなたはそのようにインポートすることができます。

import {I1, I2, ytype} from 'your_file' 
+0

に更新されましたが、私が触れたように、インターフェイスI1とI2は外部ライブラリから来て、そのライブラリのd.tsファイルで定義されています。したがって、このytypeインターフェイスを持つことはコードの重複であり、常に更新する必要があります。 –

関連する問題