typescript - Lag en generell funksjon som tar objekter, men ikke tar arrays


Jeg vil lage en generell TypeScript-funksjon som oppfyller dette:

f({ a: 1 }); // success
f(undefined); // success
f([]); // should fail the type check
f([1, 2]); // should fail the type check

Med andre ord, funksjonen skal ikke tillate at arrays blir sendt som argument, men skal ta imot objekter.

Problemet er at arrayet er et objekt i JavaScript. Selv dette er gyldig:

const x: Record<string, any> = ['test']; // works!

Så jeg vet ikke hvordan jeg kan skrive typen til argumentet eller returtypen på en generisk måte slik at det tar et hvilket som helst objekt (og også returnerer det) men ikke tar et array. Jeg vil gjøre det ved hjelp av typer heller enn på kjøretid ved å bruke Array.isArray.

Svar #1

Prøv å bruke en betinget type som:

type NotArray<T> = T extends Array<unknown> ? never : T;

function f<T>(arg: NotArray<T>) {

}

Vil mislykkes for hvilken som helst array-type argument

Relaterte artikler