2017-05-24 41 views
5

我需要獲取字符串文字的所有可能值的完整列表。獲取字符串文字類型值的數組

type YesNo = "Yes" | "No"; 
let arrayOfYesNo : Array<string> = someMagicFunction(YesNo); //["Yes", "No"] 

有什麼辦法可以解決這個問題嗎?

回答

1

打字稿2.4是finally released。在字符串枚舉的支持下,我不再需要使用字符串文字,並且因爲typescript枚舉被編譯爲javascript,所以我可以在運行時訪問它們(與number enums的方法相同)。

5

枚舉可以幫助你在這裏:

enum YesNo { 
    YES, 
    NO 
} 

interface EnumObject { 
    [enumValue: number]: string; 
} 

function getEnumValues(e: EnumObject): string[] { 
    return Object.keys(e).map((i) => e[i]); 
} 

getEnumValues(YesNo); // ['YES', 'NO'] 

type聲明沒有創建,你可以在運行時使用的任何符號,它只會造成類型系統的別名。所以你無法將它用作函數參數。

如果你需要有字符串值YesNo類型,你可以使用一個小技巧(因爲枚舉的字符串值都沒有的TS yet部分):

const YesNoEnum = { 
    Yes: 'Yes', 
    No: 'No' 
}; 

function thatAcceptsYesNoValue(vale: keyof typeof YesNoEnum): void {} 

然後你可以使用getEnumValues(YesNoEnum)獲得可能的值爲YesNoEnum,即['是','否']。這有點難看,但那是可行的。

說實話,我已經走了只是一個靜態變量是這樣的:

type YesNo = 'yes' | 'no'; 
const YES_NO_VALUES: YesNo[] = ['yes', 'no']; 
+0

謝謝,但這並不能幫助我。我需要枚舉是基於字符串的(這可能在Typescript 2.4中可能)。 – Quali

+0

@Quali公平點,我增加了一種方法來解決這個問題。 –

+0

當我嘗試@ KirillDmitrenko的建議。我的數組也允許非文字值。例如'const YES_NO_VALUES:YesNo [] = ['yes','no','maybe'];'' – jschank

相關問題