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.

Cómo usar genéricos en la tupla de Typescript.

Estoy tratando de crear la firma correcta de la función toTableGeneric. Debe tomar una matriz de Column, donde el segundo tipo genérico puede variar para cada elemento de la matriz.

La función toTable funciona para 2 elementos, pero no puedo obtener el tipo correcto para la función toTableGeneric.

¿Es posible en Typescript 4.5?

interface MyItem {
stringValue: string;
booleanValue: boolean;
}

interface Column<item, value=””> {
getter: (row: Item) => Value;
setter: (row: Item, value: Value) => void;
}

export const toTable = (
items: [Column<myitem, c1type=””>, Column<myitem, c2type=””>]
) => items;

export const toTableGeneric = <myitem, unknown=””>[]>(items: […Columns]) => items;

export const table = toTableGeneric([
{
getter: (row: MyItem) => row.stringValue,
setter: (row, value) => {
row.stringValue = value;
},
},
{
getter: (row: MyItem) => row.booleanValue,
setter: (row, value) => {
row.booleanValue = value;
},
},
]);</myitem,></myitem,></myitem,></item,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible crear la firma correcta de la función toTableGeneric utilizando Typescript 4.5. Para permitir que el segundo genérico de Column varíe para cada elemento de matriz, podemos usar tipos de tuplas con elementos restantes y tipos de acceso indexados. Aquí está el código actualizado para la función toTableGeneric:

    export const toTableGeneric = <columns extends=""></columns><myitem, unknown="">[]>(
        ...items: Columns
    ) => items;
    

    Con esta firma, podemos pasar cualquier número de objetos Column como argumentos a toTableGeneric, y el segundo genérico de Column puede variar para cada uno.

    Aquí hay un ejemplo de cómo podríamos usar esta función actualizada:

    export const table = toTableGeneric(
        {
            getter: (row: MyItem) => row.stringValue,
            setter: (row, value) => {
                row.stringValue = value;
            },
        },
        {
            getter: (row: MyItem) => row.booleanValue,
            setter: (row, value) => {
                row.booleanValue = value;
            },
        },
    );
    

    En este ejemplo, pasamos dos objetos Column a toTableGeneric, con diferentes tipos para el segundo genérico (cadena y booleano). La función infiere correctamente el tipo de la variable table como [Column<myitem, string="">, Column<myitem, boolean="">].</myitem,></myitem,></myitem,>

Comments are closed.