typescript - Hur får man parametratyper av en generisk funktion med instanserade generiska typparametrar?


Mitt mål är att extrahera Parameter-typerna för en generisk typad funktion till en ny generisk typ som jag kan använda senare:

// we have a given function like this:
function genericFunction<T>(a: T) {
  return a;
}

type genericParamsType = Parameters<typeof genericFunction>; // this will resolve to a type of [unknown]
// I would like to achieve something like this:
// type genericParamsType<PassDownType> = Parameters<typeof genericFunction<PassDownType>>;
// but that is a syntax error

// if it would work, I could the following:
// const newparams: genericParamsType<string> = ["hello"] // correct
// const newparams2: genericParamsType<number> = ["hello"] // error because its not a string

Lekplats

Svar #1

TypeScript 4.7 introducerade instansieringsuttryck, så din ursprungliga idé är inte längre ett syntaxfel. Instansieringsuttryck tillåter generiska funktioner att, ja, instansieras med konkreta typer för generiska typparametrar.

Således kan genericParamsType skrivas som följer:

type genericParamsType<T> = Parameters<typeof genericFunction<T>>;

Även om detta fortfarande inte möjliggör en verkligt generell lösning eftersom man fortfarande måste använda typeof-typfrågan på en konkret implementation, är det tillräckligt för att täcka det användningsfall som beskrivs i frågan:

// we have a given function like this:
function genericFunction<T>(a: T) {
  return a;
}

type genericParamsType<T> = Parameters<typeof genericFunction<T>>;

const newparams: genericParamsType<string> = ["hello"] // OK
const newparams2: genericParamsType<number> = ["hello"] // Type 'string' is not assignable to type 'number'.

Lekplats

Relaterade artiklar