Pesquisa de site

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