es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , ,

Answer

  1. Avatar for 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:

    export function keyed<t, k="" extends="" keyof="" t="">(object: T, key: K, value: K): Record<t[k], t[k]=""> {
      const newKey = object[key];
      const newValue = object[value];
      const newObject: Record<t[k], t[k]=""> = {};
      newObject[newKey] = newValue;
      return newObject;
    };
    

    La palabra clave TypeScript keyof se puede utilizar para especificar que K debe ser una clave válida del tipo T. El tipo Record se utiliza en lugar de una firma de índice para especificar que los pares clave-valor de newObject tendrán claves del tipo T[K] y valores del tipo T[K].

    Explicación

    La función keyed toma como entrada un objeto object, una clave key de tipo K y otra clave value de tipo K. Devuelve un nuevo objeto con un par clave-valor, donde la clave es el valor de la propiedad key del objeto de entrada y el valor es el valor de la propiedad value del objeto de entrada.

    El tipo Record es un tipo incorporado de TypeScript que representa un tipo de objeto cuyas claves son del tipo K y los valores son del tipo V. Se utiliza para especificar el tipo de retorno de la función keyed.

    Ejemplo de uso

    interface Person {
      name: string;
      age: number;
    }
    
    const alice: Person = { name: "Alice", age: 30 };
    const nameKey = "name";
    const ageKey = "age";
    
    const keyedByName = keyed(alice, nameKey, ageKey);
    console.log(keyedByName); // { Alice: 30 }
    
    const keyedByAge = keyed(alice, ageKey, nameKey);
    console.log(keyedByAge); // { 30: "Alice" }
    

    En este ejemplo, definimos una interfaz Person con las propiedades name y age. Creamos una instancia de Person llamada alice, con nombre “Alice” y edad 30.

    Luego usamos la función keyed para crear dos nuevos objetos, keyedByName y keyedByAge, donde las claves y los valores se intercambian en la segunda llamada.

    En keyedByName, la clave es el valor de la propiedad name de alice, que es “Alice”, y el valor es el valor de la propiedad age de alice, que es 30.

    En keyedByAge, la clave es el valor de la propiedad age de alice, que es 30, y el valor es el valor de la propiedad name de alice, que es “Alice”.</t[k],></t[k],></t,>

Comments are closed.