typescript - Typeparameters doorgeven aan generiek type bij het implementeren van generieke functie
Stel dat ik een functietype zoals dit krijg. Ik kan al een functie van dat type implementeren, en hoef de argument- of retourtypes niet opnieuw te declareren:
type MyFunc = (args: string) => boolean;
// TS knows args is a string and return is boolean 👍
const myFunc: MyFunc = (args) => true;
Stel echter dat ik een generiek functietype krijg. Ik zou graag een functie willen implementeren die zich aan dit type houdt, maar de generieke typeparameters doorstuurt naar de aanroeper. Is dit mogelijk? Mijn poging geeft een fout:
type ReturnsSomething<A> = (args: A) => A;
// Generic type 'ReturnsSomething' requires 1 type argument(s).ts(2314)
const logAndReturnSomething: ReturnsSomething = (args) => {
console.log(args);
return args;
};
logAndReturnSomething<string>('asdf');
Dit werkt ook niet:
type ReturnsSomething<A> = (args: A) => A;
// Cannot find name 'A'.ts(2304)
const logAndReturnSomething: ReturnsSomething<A> = (args) => {
console.log(args);
return args;
};
logAndReturnSomething<string>('asdf');
In complexere gevallen wil ik de argumenten en retourtypen niet opnieuw definiëren in al mijn implementaties, omdat dat het doel van een deelbare ReturnsSomething generiek tenietdoet. Is er een manier om een generieke functie te implementeren die zijn typeargumenten doorstuurt naar een generiek type?
Ik zou een wrapperfunctie kunnen maken om dit type af te dwingen, maar dat betekent dat ik bij elk gebruik een dubbele functietaak moet uitvoeren. Ik wou dat er een schonere manier was:
type ReturnsSomething<A> = (args: A) => A;
function makeLogAndReturnSomething<A>(): ReturnsSomething<A> {
return (args) => {
console.log(args);
return args;
};
}
makeLogAndReturnSomething<string>()('asdf');
Ik gebruik TypeScript 4.6 voor wat het waard is, niet zeker of 4.7 dit zal oplossen of dat er een TypeScript-syntaxis is die ik mis.
Antwoord #1
Probeer dit:
type GenericFn = <A>(args: A) => A;
const logAndReturnSomething: GenericFn = (args) => {
console.log(args);
return args;
};
const result = logAndReturnSomething('asdf'); //infers return type as string
In wezen creëren we geen generiek type, maar eerder een generieke functie. Het is verwarrend, ik weet het :)
Er is een geweldige korte YouTube-video als je dieper wilt graven.
TS-speelplaats
