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
