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.

Una lista de genéricos con diferentes, pero internamente consistentes parámetros de tipo.

Actualmente estoy creando una interfaz que representa una configuración para la visualización de un atributo. Esto es lo que tengo:

interface DisplayConfig<objt, valuet=""> {
  label: string,
  formatter: (value: ValueT) => string,
  getter: (obj: ObjT) => ValueT,
}

El getter es una función utilizada para recuperar el valor y el formatter toma ese valor y lo convierte en una forma legible para los humanos.

Ahora quiero tipar un arreglo de estas configuraciones:

interface AttributeTableProps<> {
  rows: DisplayConfig<plan, any="">[]
}

El problema es que, cuando intento instanciar el objeto anterior de esta manera:

const a: AttributeTableProps = {
  rows: [{
    label: "Additional storage per pu",
    getter: (plan) => plan.storage,
    formatter: {memoryFormatter}
  }],
}

Recibo un error, porque mi memoryFormatter solo sabe cómo formatear valores de Memory. Un valor de tipo Memory se mantiene en plan.storage, pero TypeScript quiere un formato capaz de renderizar any.

Mi pregunta es: ¿cómo puedo crear los tipos como se pretende? Quiero que cada elemento en mi arreglo sea “internamente coherente” (es decir, el formatter capaz de aceptar como argumento el resultado del getter), pero al mismo tiempo, permitir que las filas operen en diferentes ValueT.</plan,></objt,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en informática especializado en TypeScript y genéricos, el problema en cuestión se puede resolver haciendo que la interfaz DisplayConfig sea más flexible utilizando un parámetro de tipo genérico para la función formatter. Esto permitirá que el formatter se defina en función de los ValueT proporcionados, que pueden variar de fila a fila.

    La interfaz actualizada se verá así:

    interface DisplayConfig<objt, valuet,="" formatt="string"> {
      label: string,
      formatter: (value: ValueT) => FormatT,
      getter: (obj: ObjT) => ValueT,
    }
    

    Al agregar el nuevo parámetro de tipo genérico FormatT, ahora podemos especificar el tipo de salida formateada. Esto nos permitirá ajustar el formato para manejar diferentes tipos de valores.

    Ahora, actualicemos la interfaz AttributeTableProps para incluir el parámetro de tipo genérico FormatT:

    interface AttributeTableProps<plan, formatt="string"> {
      rows: DisplayConfig<plan, any,="" formatt="">[]
    }
    

    Con esto, podemos crear una instancia del objeto AttributeTableProps con verificación de tipos.

    const a: AttributeTableProps<plan, string=""> = {
      rows: [{
        label: "Almacenamiento adicional por PU",
        getter: (plan) => plan.storage,
        formatter: memoryFormatter
      }],
    }
    

    Esto debería compilar correctamente ya que memoryFormatter puede manejar valores del tipo Memory y devuelve string.

    En general, agregar un nuevo parámetro de tipo genérico para la función formatter puede hacer que la interfaz DisplayConfig sea más flexible y evitar problemas con funciones de formato incompatibles.</plan,></plan,></plan,></objt,>

Comments are closed.