[英]Get string literal types from Array of objects
所以從:
export interface Category{
val: string;
icon: string
}
const categoryArray: Category[] = [
{
val: 'business',
icon: 'store'
},
{
val: 'media',
icon: 'video'
},
{
val: 'people',
icon: 'account'
},
...
我想像這樣得到一個 Union 類型:
'business' | 'media' | 'people' ...
我不知道有什么樣的語法或助手,也許根本沒有。 我意識到這種方式可能是倒退的,也許應該使用枚舉,但在此之前,我想知道它是可能的。
我想做的一些虛構的例子,但我希望解決方案更復雜
type Cats = keysof[] categoryArray 'val'
type Cats = valuesof categoryArray 'val'
以下是關閉的,但返回string
:
export type CatsValType = typeof categories[number]['val']
或以下; 而不是我需要字符串文字的類型
type ValueOf<T> = T[keyof T];
type KeyTypes = ValueOf<typeof categories[number]> // Returns: `string`
有類似的問題: TypeScript 中是否有類似於 `keyof` 的`valueof`? 但他們不假設一組對象。
和這里的例子: https://www.typescriptlang.org/docs/handbook/2/indexed-access-types.html是類似的,但我不想返回類型,而是字段的值,所以我得到了一個聯合類型。
如果滿足以下條件,您可以這樣做:
數組中的值在運行時不會改變(因為類型信息是 TypeScript 的僅編譯時的東西); 和
您告訴 TypeScript 使用as const
不會改變它們的值; 和
categoryArray
常量類型Category[]
,因為如果您這樣做,結果將只是string
(因為Category["val"]
的類型是string
)而不是您想要的字符串文字聯合類型。這是一個示例( 操場鏈接):
export interface Category{
val: string;
icon: string
}
const categoryArray = [
{
val: 'business',
icon: 'store'
},
{
val: 'media',
icon: 'video'
},
{
val: 'people',
icon: 'account'
},
] as const;
type TheValueUnion = (typeof categoryArray)[number]["val"];
// ^? −− "business" | "media" | "people"
關鍵位有as const
和type TheValueUnion = (typeof categoryArray)[number]["val"];
,分解如下:
typeof categoryArray
獲取categoryArray
的類型(推斷的類型,因為我們沒有分配特定的類型)。[number]
訪問由categoryArray
類型上的 number 索引的類型的聯合。["val"]
訪問來自 #2 的聯合上val
屬性的類型聯合,這是您想要的字符串文字類型: "business" | "media" | "people"
"business" | "media" | "people"
"business" | "media" | "people"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.