Pesquisa de site

typescript - Obter tipo de união a partir dos valores de um objeto indexado


Diga que eu tenho um tipo indexado:

type X = {
 a: 'A',
 b: 'B'
}

é possível obter (derivado) a partir disso:

type V = 'A' | 'B'

não usando método explícito como:

type V = X['a'] | X['b']

O que eu quero é algo como keyof (para obter o tipo união das chaves), mas para valores.

Resposta #1

Você pode usar uma consulta de tipo com o resultado de keyof:

type V = X[keyof X]

Geralmente, uma consulta de tipo retornará uma união de todos os tipos de campo possíveis, então X['a'] | X['b'] é o mesmo que X['a' | 'b']. É por isso que X[keyof X] funciona, pois keyof retornará uma união de tipos literais de string representando todas as chaves no objeto.

Resposta #2

Percebo que isso já foi respondido, mas se você está procurando uma maneira de restringir sua união a valores reais em vez de primitivos e está trabalhando com estado imutável, você pode fazer o seguinte:

const X = {
  a: 'A', 
  b: 'B'
  // mark properties as readonly, otherwise string type inferred 
} as const

type XValues = typeof X[keyof typeof X]

// "A" | "B

Alternativamente, se você estiver trabalhando com cópias mutáveis e imutáveis, criar um tipo somente leitura separado pode ser útil:

const X = {
  a: 'A',
  b: 'B'
} 

type X = Readonly<typeof X>

type XValues = keyof X  

// "A" | "B

Artigos relacionados