2017-08-10 76 views
1

我需要強制一個數組擁有一組特定的值,這些值應該是我的接口的鍵。 我可以強制陣列陣列類型的Typescript接口

type SomeProperties = ['prop1', 'prop2', 'prop3']; 

,但我不知道如何強制接口有這些屬性。我想是這樣

type MyInterface = { 
    [key in keyof SomeProperties]: string; 
} 

但顯然數組的按鍵都只是數字,所以我的界面成爲

interface MyInterface { 
    0: string; 
    1: string; 
    2: string; 
} 

,而不是想要的界面

interface MyInterface { 
    prop1: string; 
    prop2: string; 
    prop3: string; 
} 

你知道,如果有在Typescript中實現這一點的一種方法?

這將是有用的,因爲我需要迭代一些屬性來「克隆」一個對象,我也需要輕鬆訪問這些屬性。 在類型和界面中重複屬性對我來說都有點脆弱。

+0

嘗試將'Someofperties'鍵改爲'SomeProperties [number]'。 – jcalz

+0

@jcalz這是一個好主意,但不幸的是它不起作用,IDE暗示了我的屬性,比如'length','at','charAt'等等,但不是'prop1','prop2'或'prop3' :( – Julo

+0

不是'keyof SomeProperties [number]';只是'SomeProperties [number]'。 – jcalz

回答

0

當你注意,你要訪問的字符串不SomeProperties,但元素SomeProperties

可以使用indexed access operator這裏:如果KT一個鍵(或鍵的聯合),然後T[K]是對應於訪問的TK鍵(一個或多個)的屬性類型(或屬性類型的聯合) 。

元組和數組接受number爲一鍵式,所以要使用SomeProperties[number]給你工會"prop1"|"prop2"|"prop3"

type SomeProperties = ['prop1', 'prop2', 'prop3']; 

type MyInterface = { 
    [key in SomeProperties[number]]: string; 
} 

const myInterface: MyInterface = { 
    prop1: 'this', 
    prop2: 'works', 
    prop3: 'now' 
} 

希望幫助;祝你好運!

1

值得注意的是:你不能在打字稿

遍歷一個元組類型,這些各種操作只能應用於type S,不interface秒。

type SomeProperties = 'prop1' | 'prop2' | 'prop3'; 

type MyType = { 
    [key in SomeProperties]: string 
} 

類型和接口是從消費者的角度相同(當你問一個MyType,你不關心,如果它是一個接口或類,它們是相同的,在這一點上)

+0

我會改變我的問題,對不起。 那麼你認爲我不可能實現我所要求的? – Julo