Búsqueda de sitios web

typescript - ¿Cómo definir una interfaz para objetos con claves dinámicas?


Tengo un objeto como este que es creado por el método _.groupBy() de underscore.

myObject = {
  "key" : [{Object},{Object2},{Object3}],
  "key2" : [{Object4},{Object5},{Object6}],
  ...
}

¿Cómo definiría eso como una interfaz en TypeScript? No quiero simplemente definirlo como myObject:Object={ ..., sino tener un tipo propio para ello.

Respuesta #1

Tu objeto se ve como un diccionario de arreglos de Object

interface Dic {
    [key: string]: Object[]
}

La literatura de TypeScript a menudo se refiere a este patrón como "la descripción de un objeto indexable" con una forma general

interface Dic {
    [key: string|number]: object_type
}

o

type Dic = {
    [key: string|number]: object_type
}

Respuesta #2

Ahora hay un tipo Record dedicado en TypeScript:

const myObject: Record<string, object[]> = { ... }

Además, considera escribir las teclas siempre que sea posible:

type MyKey = 'key1' | 'key2' | ...

const myObject: Record<MyKey, object[]> = { ... }

Respuesta #3

{ [x: string]: T }

y

Record<string, T>

por lo general servirá para todos tus objetivos. Sin embargo, llegué a un punto extraño donde después de algunos tipos de operaciones la primera opción me devolvía tanto [x: string] como [x: number], y no podía usar el Record, ya que era una operación de tipo recursiva y Typescript lanzaba un error diciendo que mi tipo recursivo no era genérico.

Entonces, estudiando el código de Record realmente pequeño, llegué a esta solución que resolvió mi problema complejo:

{ [P in string]: T }

Editar: También suelo tener esto en cada código de Typescript que escribo, en un archivo utils.ts:

export type obj<T = unknown> = Record<string, T>

Más rápido y limpio que usar la función Grabar todo el tiempo.

Por ejemplo:

type MyObjectType = {
  propA: obj; // An object with unknown props
  propB: obj<number>; // An object with number props
}

Artículos relacionados