Crear una función en Typescript que, dada un objeto, devolverá otro objeto que tendrá claves y valores derivados de los valores del objeto dado.
Estoy tratando de entender los tipos en Typescript. En general va bien pero tengo problemas para convertir esta función de Javascript a Typescript.
export function keyed(object, key, value) {
const newKey = object[key];
const newValue = object[value];
const newObject = {};
newObject[newKey] = newValue;
return newObject;
};
Esta es mi intento hasta ahora:
type ValueOf<t> = T[keyof T];
export function keyed<t, k="" extends="" keyof="" t="">(object: T, key: K, value: K): { [key: ValueOf<t>]: ValueOf<t> } {
const newKey: ValueOf<t> = object[key];
const newValue: ValueOf<t> = object[value];
const newObject: { [key: ValueOf<t>]: ValueOf<t> } = {};
newObject[newKey] = newValue;
return newObject;
};
Pero estoy recibiendo algunos errores como:
An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead.ts(1337)
y
Type 'ValueOf<T>' cannot be used to index type '{}'.ts(2536)
He intentado usar las definiciones de DefinitelyTyped para ayudar aquí, ya que hacen mucho este tipo de operaciones pero no he tenido suerte. ¿Es imposible?</t,>
davy.ai
Solución
Los errores se están produciendo debido a una sintaxis incorrecta y tipos mal colocados. Aquí está la implementación corregida:
La palabra clave TypeScript
keyof
se puede utilizar para especificar queK
debe ser una clave válida del tipoT
. El tipoRecord
se utiliza en lugar de una firma de índice para especificar que los pares clave-valor denewObject
tendrán claves del tipoT[K]
y valores del tipoT[K]
.Explicación
La función
keyed
toma como entrada un objetoobject
, una clavekey
de tipoK
y otra clavevalue
de tipoK
. Devuelve un nuevo objeto con un par clave-valor, donde la clave es el valor de la propiedadkey
del objeto de entrada y el valor es el valor de la propiedadvalue
del objeto de entrada.El tipo
Record
es un tipo incorporado de TypeScript que representa un tipo de objeto cuyas claves son del tipoK
y los valores son del tipoV
. Se utiliza para especificar el tipo de retorno de la funciónkeyed
.Ejemplo de uso
En este ejemplo, definimos una interfaz
Person
con las propiedadesname
yage
. Creamos una instancia dePerson
llamadaalice
, con nombre “Alice” y edad 30.Luego usamos la función
keyed
para crear dos nuevos objetos,keyedByName
ykeyedByAge
, donde las claves y los valores se intercambian en la segunda llamada.En
keyedByName
, la clave es el valor de la propiedadname
dealice
, que es “Alice”, y el valor es el valor de la propiedadage
dealice
, que es 30.En
keyedByAge
, la clave es el valor de la propiedadage
dealice
, que es 30, y el valor es el valor de la propiedadname
dealice
, que es “Alice”.</t[k],></t[k],></t,>