簡體   English   中英

如何使用 TS 類型作為值

[英]How to use TS type as a value

我有一個 TypeScript 類型,它有一堆字符串,它的定義如下:

type Regions = "" | "eu-west-1" | "eu-east-1" | "us-west-1" | "us-east-1" | "ap-southeast-1" | "ap-east-1"

然后我稍后在我的代碼中通過查詢字符串參數從 URL 獲取區域。 假設從 URL 檢索到的區域是一個名為region的變量

所以我在我的代碼中做一些驗證,我想確保該regionRegions類型。

因此,為了進行驗證,我的代碼說: if (region in Regions) { doStuff();}

如果 Region 是所有這些區域的變量,這將起作用。

但是,由於 Regions 是一種類型,因此會拋出錯誤: 'Regions' only refers to a type, but is being used as a value here

我明白為什么,但是如何使用或擴展type Regions來實現我想要做的事情

我真的不想創建另一個 object 或字符串數組,我只想使用我現有的類型來進行此驗證。

我確實創建了一個這樣的枚舉:

enum RegionsList {
  'eu-west-1',
  'eu-east-1',
  'us-west-1',
  'us-east-1',
  'ap-southeast-1',
  'ap-east-1'
}

然后region in RegionsList但這有點重復了我的 Regions 類型,並且必須有一個更好的解決方案來結合 2。任何幫助/建議表示贊賞。

你不能從一個類型中產生一個值,但你可以從一個值中推斷出一個類型。 這意味着您應該從一些運行時值開始,並讓編譯器從中推斷出Regions類型。


例如,您可以創建一個有效區域名稱的數組:

const Regions = ["", "eu-west-1", "eu-east-1", "us-west-1", 
  "us-east-1", "ap-southeast-1", "ap-east-1"] as const;
type Regions = typeof Regions[number];

您可以驗證類型Regions是否與您的定義中的相同。 然后你可以使用數組來檢查一個字符串是一個有效的Regions (比如當你實現一個用戶定義的類型保護 function 時):

function checkRegion(region: string): region is Regions {
  return (Regions as readonly string[]).indexOf(region) >= 0;
}

或者,如果您想使用in ,您可以創建一個 object ,其鍵是您關心的值,而不是創建一個數組:

const Regions = {
  "": true,
  "eu-west-1": true,
  "eu-east-1": true,
  "us-west-1": true,
  "ap-southeast-1": true,
  "ap-east-1": true
}
type Regions = keyof typeof Regions;

您可以再次驗證Regions是正確的類型,並使用in

function checkRegion(region: string): region is Regions {
  return region in Regions;
}

可以使用上面的enum ,但您需要小心,因為數字枚舉具有反向映射,因此"0" in RegionsEnumtrue ,可能令人驚訝。 如果您仍然願意使用它,它可能看起來像這樣:

enum RegionsEnum {
  "", "eu-west-1", "eu-east-1", "us-west-1", "ap-southeast-1", "ap-east-1"
}
type Regions = keyof typeof RegionsEnum;
function checkRegion(region: string): region is Regions {
  return (region !== (+region) + "") && region in RegionsEnum;
}

(請注意確保該region不是“數字字符串”的額外代碼)。


好的,希望有幫助; 祝你好運!

Playground 代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM