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
}
