[英]TypeScript: from a string union literal array type, disallow any redundant values from existing in the array
[英]TypeScript array to string literal type
我目前有一個字符串數組和一個包含相同字符串的字符串文字聯合類型:
const furniture = ['chair', 'table', 'lamp'];
type Furniture = 'chair' | 'table' | 'lamp';
我的應用程序中需要兩者,但我試圖保持我的代碼干燥。 那么有沒有辦法從另一個中推斷出一個?
我基本上想說的是type Furniture = [any string in furniture array]
,所以沒有重復的字符串。
通過使用通用的 rest 參數,有一種方法可以將string[]
正確推斷為文字元組類型,然后獲取文字的聯合類型。
它是這樣的:
const tuple = <T extends string[]>(...args: T) => args;
const furniture = tuple('chair', 'table', 'lamp');
type Furniture = typeof furniture[number];
TypeScript 3.4 版引入了所謂的const contexts ,這是一種將元組類型聲明為不可變並直接獲取窄文字類型的方法(無需調用如上所示的函數)。
使用這個新語法,我們得到了這個很好的簡潔解決方案:
const furniture = ['chair', 'table', 'lamp'] as const;
type Furniture = typeof furniture[number];
最好的解決方法:
const furnitureObj = { chair: 1, table: 1, lamp: 1 };
type Furniture = keyof typeof furnitureObj;
const furniture = Object.keys(furnitureObj) as Furniture[];
理想情況下,我們可以這樣做:
const furniture = ['chair', 'table', 'lamp'];
type Furniture = typeof furniture[number];
不幸的是,今天furniture
被推斷為string[]
,這意味着Furniture
現在也是string
。
我們可以使用手動注釋將類型強制為文字,但它會帶回重復:
const furniture = ["chair", "table", "lamp"] as ["chair", "table", "lamp"];
type Furniture = typeof furniture[number];
TypeScript問題 #10195跟蹤向 TypeScript 提示列表應該被推斷為靜態元組而不是string[]
,所以也許在未來這將成為可能。
typescript 3.4 中最簡單的:(注意 TypeScript 3.4 添加了const 斷言)
const furniture = ["chair", "table", "lamp"] as const;
type Furniture = typeof furniture[number]; // "chair" | "table" | "lamp"
另見https://stackoverflow.com/a/55505556/4481226
或者,如果您將這些作為對象中的鍵,您也可以將其轉換為聯合:
const furniture = {chair:{}, table:{}, lamp:{}} as const;
type Furniture = keyof typeof furniture; // "chair" | "table" | "lamp"
我建議的唯一調整是使const
保證與類型兼容,如下所示:
type Furniture = 'chair' | 'table' | 'lamp';
const furniture: Furniture[] = ['chair', 'table', 'lamp'];
如果您在數組中出現拼寫錯誤或添加未知項目,這將向您發出警告:
// Warning: Type 'unknown' is not assignable to furniture
const furniture: Furniture[] = ['chair', 'table', 'lamp', 'unknown'];
這對您沒有幫助的唯一情況是數組不包含其中一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.