簡體   English   中英

從對象數組中獲取字符串文字類型

[英]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不會改變它們的值;

  1. 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 consttype TheValueUnion = (typeof categoryArray)[number]["val"]; ,分解如下:

  1. typeof categoryArray獲取categoryArray的類型(推斷的類型,因為我們沒有分配特定的類型)。
  2. [number]訪問由categoryArray類型上的 number 索引的類型的聯合。
  3. ["val"]訪問來自 #2 的聯合上val屬性的類型聯合,這是您想要的字符串文字類型: "business" | "media" | "people" "business" | "media" | "people" "business" | "media" | "people"

暫無
暫無

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

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