Gostaria de declarar uma matriz de itens aplicada por tipo e poder derivar um tipo de união a partir dela. Esse padrão funciona se você não atribuir explicitamente um tipo aos itens na matriz. Não tenho certeza de como melhor explicá-lo, então aqui está um exemplo:
EXEMPLO 1
type Pair = {
key: string;
value: number;
};
const pairs: ReadonlyArray<Pair> = [
{ key: 'foo', value: 1 },
{ key: 'bar', value: 2 },
] as const;
type Keys = typeof pairs[number]['key']
EXEMPLO 2
type Data = {
name: string;
age: number;
};
const DataRecord: Record<string, Data> = {
foo: { name: 'Mark', age: 35 },
bar: { name: 'Jeff', age: 56 },
} as const;
type Keys = keyof typeof DataRecord;
Aqui está um exemplo de derivação das chaves ao usar as const
. Eu quero esse mesmo comportamento, mas com a matriz sendo explicitamente digitada.
const pairs = [
{ key: 'foo', value: 1 },
{ key: 'bar', value: 2 },
] as const;
type Keys = typeof pairs[number]['key']; // "foo" | "bar"
valor desejado das chaves: "foo"|"bar"
valor real das chaves: string
key
atributo doPair
tipo o tipo que deseja, e ele deve funcionar como você o escreveu.possibleKeys = ['foo', 'bar'] as const; type Keys = typeof possibleKeys[number]; type Pair = { key: Keys, value: number };
mas ainda precisa enumerar explicitamente as chaves possíveis.Respostas:
Para uma variável, você pode deixar o compilador inferir o tipo da inicialização ou gravá-lo explicitamente. Se você o escrever explicitamente, como você fez, o valor de inicialização será verificado na anotação, mas o tipo real do inicializador não afeta o tipo da variável (para que você perca as informações de tipo que deseja). Se você deixar o compilador inferir, não será mais possível restringir o tipo a uma interface específica (como você deseja)
A solução para isso é usar uma função genérica para restringir o valor e inferir que é do tipo real:
Link para parque infantil
Nota: Para o caso do array, precisamos armar um pouco o compilador para inferir tipos literais de strings para
key
, portanto, o todo& Array<{key: V}>
, ondeV
está um parâmetro de tipo que se estendestring
fonte
As abordagens usuais são:
pairs
omitindo o tipo explícitoReadonlyArray<Pair>
(consulte a resposta )key
Pair
"foo"|"bar"
Se você não quiser fazer isso, a única maneira de inferir suas chaves e restringir o tipo
pairs
é usar uma função auxiliar. OPair
tipo também será tornado genérico para salvar oskey
tipos literais de string fornecidos . Você pode usar um IIFE para compactar a tarefa:Parque infantil
fonte