javascript - Hur man återanvänder argumenttypdeklaration i TypeScript


Säg att jag har kod som detta:

function updateById(
  collection: Record<string, any>[],
  id: number,
  patch: Record<string, any>
): any[] {
  return collection.map(item => {
    if (item.id === id) {
      return {
        ...item,
        ...patch
      };
    }

    return item;
  });
}

function updateRefById(
  collection: Ref<Record<string, any>[]>,
  id: number,
  patch: Record<string, any>
): void {
  collection.value = updateById(collection.value, id, patch);
}

Det finns en generell updateById-funktion och en mer specifik updateRefById som omsluter den. Som du kan se finns det viss duplicering i typkontrollen eftersom de har nästan samma argument.

Finns det något sätt att göra detta mer DRY?

Det enda jag kan föreställa mig är att skicka alla argument som ett alternativobjekt. Men jag är inte säker på om jag vill göra det.

Svar #1

Detta kan göras med en generisk typ, så redundanta typer kan hoppas över. Detta kommer att kräva att funktionens deklarationer ersätts med variabler och kommer inte vara en stor förbättring i detta fall eftersom retur- och collection-parametertyper inte är duplicerade:

type TCollection = Record<string, any>[];
type TUpdateFn<T, U> = (
  collection: T,
  id: number,
  patch: Record<string, any>
) => U;

const updateById: TUpdateFn<TCollection , any[]> = (collection, id, patch) => { ... };

const updateRefById: TUpdateFn<Ref<TCollection>, void> = (collection, id, patch) => { ... };

Relaterade artiklar