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.

Tipos dinámicos en Typescript

¿Cómo se definiría el tipo de retorno de la función fn a continuación?

const fn = (propName1: string, propName2: string) => {
  return { 
    [propName1]: () => true,
    [propName2]: () => 'abc'
  }
}
const x = fn('customProp1', 'customProp2')
console.log(x.customProp1)
console.log(x.customProp2)

por ejemplo

type FN = (propName: string) => {
}

Esto es para dos métodos personalizados, pero idealmente la solución debería permitir cualquier número de métodos y propiedades personalizados.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para definir el tipo de retorno de la función fn con cualquier número de propiedades personalizadas, podemos usar una firma de índice. El valor de retorno de la función fn es un objeto con claves que son determinadas dinámicamente por los parámetros propName1 y propName2, por lo que necesitamos usar una firma de índice para permitir cualquier número de pares clave/valor.

    Aquí tienes un ejemplo de cómo podemos definir el tipo de retorno:

    type CustomObject<t extends="" string=""> = {
      [P in T]: (() => true) | (() => string);
    };
    
    type FN = <t extends="" string="">(...propNames: T[]) => CustomObject<t>;
    
    const fn: FN = (...propNames) => {
      const obj = {} as CustomObject<typeof propnames[number]="">;
      propNames.forEach((propName) => {
        if (propName) {
          obj[propName] = () => true;
          obj[propName] = () => 'abc';
        }
      });
      return obj;
    };
    
    // Ejemplo de uso
    const x = fn('customProp1', 'customProp2');
    console.log(x.customProp1()); // true
    console.log(x.customProp2()); // 'abc'
    

    En este ejemplo, definimos un tipo CustomObject con una firma de índice que toma cualquier cadena T y devuelve una unión de funciones que pueden retornar tanto true como una cadena. Luego, definimos el tipo FN como una función genérica que toma cualquier número de argumentos de tipo cadena y devuelve un CustomObject con claves definidas por esos argumentos de cadena.

    Usamos la sintaxis ...propNames para capturar todos los argumentos de tipo cadena en un array, y luego iteramos sobre ese array para asignar las funciones correspondientes a cada propiedad del objeto.

    Finalmente, demostramos el uso de la función fn llamándola con dos nombres de propiedades personalizadas, y luego accediendo a esas propiedades para confirmar que tienen el tipo y valor esperados.

Comments are closed.