Estoy creando una aplicación que accede a una API que devuelve un objeto con muchas claves desconocidas, cada clave representa una identificación de usuario.
Ejemplo:
const response = { "random id1": {name: "user1"}, "random id2": {name: "user2"}, ... "random id100": {name: "user100"} }Sé que si solo tengo una clave desconocida, puedo definir usando algo como:
type MyDefinition = { [key: string]: Metadata }Pero, ¿cómo puedo definir un objeto con tantas claves diferentes?
Extendiendo el comentario de @ASDFGerte. Puede generar un rango de números de 0 a 998 en TypeScript 4.5:
type MAXIMUM_ALLOWED_BOUNDARY = 999 type ComputeRange< N extends number, Result extends Array<unknown> = [], > = (Result['length'] extends N ? Result : ComputeRange<N, [...Result, Result['length']]> ) // 0 , 1, 2 ... 998 type NumberRange = ComputeRange<MAXIMUM_ALLOWED_BOUNDARY>[number] type Name<T extends string> = { name: T } type CustomResponse = { [Prop in NumberRange]: Record<`random id${Prop}`, Name<`id${Prop}`>> }Aquí y aquí puede encontrar una explicación del rango de números.
Probablemente hayas notado que hay un límite que no puedes cruzar.
Con el enfoque anterior, no permitirá random id1e4 .
Puede usar un tipo definido con una cadena de plantilla como esta:
const response: { [key: `random id${number}`]: { name: string }} = { "random id1": {name: "user1"}, "random id2": {name: "user2"}, "random id100": {name: "user100"} }Puedes verlo en acción en este patio de juegos de TypeScript .
[key: string] permite cualquier cantidad de cadenas únicas como claves.
type Metadata = { name: string } type MyDefinition = { [key: string]: Metadata } const response: MyDefinition = { "random id1": {name: "user1"}, "random id2": {name: "user2"}, // ... "random id100": {name: "user100"}, };Pruébalo en TypeScript Playground