2016-03-30 87 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; 

但後來我得到從庫中一個保持它最新的負擔,而且它可以是非常大,導致很多重複的代碼。

因此,有沒有什麼辦法來「提取」這個接口的這個特定屬性的類型?類似於let myVar: typeof I2.y(它不起作用並導致「無法找到名稱I2」錯誤)。提前致謝。


編輯:在TS操場打了一下後,我發現下面的代碼實現了我想要什麼:

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

然而它需要一個多餘的變量x聲明。我正在尋找一種方法來實現這個沒有這個聲明。

+1

*哪些行不通* - 如何表現?你看到的實際錯誤信息是什麼? –

+0

@BartekBanachewicz更新 –

回答

23

這不是婆可能之前,但幸運的是現在,因爲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% 3A%20typeof%20X%5B0%5D%3B%20%2F%2FY%圖20是%20of%20type%20%22number%22%0D%0A%0D%0A%2F%2Fworks%20also%20with%20tuples%0D% 0Alet%20X1%3A%20%5Bstring%2C%20boolean%2C%20number%5D%3B%0D%0Alet%20y1%3A%20typeof%20X1%5B1%5D%3B%20%2F%2Fy1%圖20是%20of% 20type%20boolean –

+0

@JohnB是的,你可以以同樣的方式訪問它,即。 'I2 ['y'] [0]'See:http://www.typescriptlang.org/play/index.html#src=interface%20I1%20%7B%0D%0A%20%20%20%20x %3A%20any%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20I2%20%7B%0D%0A%20%20%20%20Y%3A%20Array%3CI1%3E%0D%0A %20%20%20%20Z%3A%20any%0D 0A%%7D%0D 0A%%0D%0Alet%20myVar%3A%20I2%5B'y'%5D%5B0%5D%3B%0D 0A%% 0D%0Aconsole.log(myVar.x)%3B%0D 0A% –

0

接口就像對象的定義一樣。然後,y是I2對象的屬性,它屬於某種類型,在這種情況下是「匿名」。

你可以使用另一個接口來定義y,然後用它作爲你的Y型這樣

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

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

你可以把你的界面在一個文件中,並使用提取物,因此您可以在其他文件中導入您的科技項目

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接口將是一個代碼重複,需要不斷更新。 –

相關問題