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"
