網站搜尋

typescript - elementof?我可以做到這個嗎?


這是我想要達成的目標:

const names = ["foo", "bar", "baz"];
type NameType = elementof names;  // This is not valid TypeScript

行為將與此相同:

type NameType = "foo" | "bar" | "baz";

一個解決方案需要完成幾件事情。

  • 提供一個有序的可列舉字串序列。
  • 將名稱公開為可尋址的字串字面量類型聯合。
  • 允許在不冗餘修改原始程式碼的情況下進行字串維護。

TypeScript 能做到這個嗎?

注意:這與將 string[] 字面量轉換為 string 類型字面量不同,因為那個問題不需要特定順序的字串序列。聯合類型在運行時不會提供任何獲取順序資訊的方法。

答案#1

你可以使用類型查詢來獲取項目的類型:

type NameType = typeof names[number];

問題是 names 的類型是 string[],所以上述程式碼只會產生 string。

你可以使用輔助函數推斷 const 的字串字面值類型。

function array<T extends string>(p: T[]) : T[] {
  return p
}

const names = array(["foo", "bar", "baz"]);
type NameType = typeof names[number];   // The same as "foo" | "bar" | "baz"