typescript - É possível definir um tipo para um objeto aninhado com profundidade variável?
Eu tenho uma função que aninha objetos com base no comprimento de um array de entrada. Por exemplo:
fn(['a']) -> Record<string, string>
fn(['a', 'b']) -> Record<Record<string, string>>
Estou definindo o tipo de retorno como:
type Ret = {
[k: string]: string | Ret;
}
No entanto, isso não sabe a profundidade do objeto. Se a entrada for uma tupla TS, então, em teoria, deveria ser possível saber a profundidade do tipo de retorno. Isso é atualmente possível?
Resposta #1
Usando um tipo condicional definido recursivamente:
type NestedRecord<T extends any[]>
= T extends [any, ...infer R]
? Record<string, NestedRecord<R>>
: string
Exemplo :
type Test = NestedRecord<['a', 'b']>
// {[x: string]: Record<string, string>}
Link do Playground
