Búsqueda de sitios web

Typescript: mapear el tipo de valor de objeto para cada clave


En el código de ejemplo de abajo:

const obj = {
  a: () => 1,
  b: () => '2'
}

type typeMap = Record<keyof typeof obj, (arg: unknown) => void>

const map: typeMap = {
  a: (numberArg) => numberArg + 1,
  b: (stringArg) => stringArg.length
}

Quiero que Typescript sea consciente de que los tipos de los argumentos de la función en el objeto map sean los mismos que el tipo de retorno de cada clave en el objeto original obj. Sé que existe la utilidad ReturnType<>, pero no sé cómo usarla para mapear cada propiedad de obj.

En resumen, quiero que numberArg sea de tipo number y que stringArg sea de tipo string.

Puedes abrir este código en Typescript Playground.

Respuesta #1

Usa un tipo de objeto mapeado:

// alias for convenience
type ObjType = typeof obj;
type TypeMap = {
  [K in keyof ObjType]: (arg: ReturnType<ObjType[K]>) => unknown
};

Enlace del parque