0
votes

Inférer générique Typescript de la fonction imbriquée

J'ai cette fonction TS:

const fnGeneric = <V,I>(fn:<U>(param:U) => V, param:I) => fn(param);
const fn = (some:string) =>  some;
const result = fnGeneric(fn,5);


5 commentaires

Où sont u v et i défini?


const fngénère = (fn: (param: u) => v, param: i) => fn (param); Editeur désolé


Pourquoi pas const fngénère = (fn: (param: u) => v, param: u) => fn (param); const fn = (certains: string) => certains; const résultat = fnfénérique (fn, "5"); ? fn ne doit pas être en soi une fonction générique.


Vous pouvez même le faire pour la fonction avec plusieurs paramètres Stackoverflow.com/Questtions/54795439/...


Je vous donne plus de cas d'utilisation appropriée en réponse


3 Réponses :


-1
votes

Je peux vous donner plus de scénario réaliste, j'ai fait une version plus simple de fn, il y a réel:

export const inject = (fn: (entrée?: u) = > V, resolvewithpayload: booléen, resolveargs?: I) => (charge utile: r): r => { ResolveWithPayLoad? FN (Charge utile): Resolveargs? FN (Resolveargs): FN (); retour de la charge utile; }; xxx

mais l'appelant se termine par:

argument  de typeâ '(valeur:  Number)  =>  Number'â n'est pas assignableâ à paramètre de Type' (entrée ?:  U)  =>  Numéro '.   Types de paramètres 'VALEUR' ETÂ' INPUT'A INCOMPATIBLE.     'Type' U' n'est pas assignableâ à tapez 'numéro'.

Si j'améliore le code à la mode:

Export const injecter = (fn: (entré ?: u) => V, résolvewithpayload: booléen, resolveargs ?: i) => (charge utile: r): r => { ResolveWithPayLoad? FN (Charge utile): Resolveargs? FN (Resolveargs): FN (); retour de la charge utile; };

Il se termine par type Définition Erreur lors de l'injection elle-même comme:

ts2345: argument de type 'R' n'est pas assigné au paramètre de type 'U'.

TS2345: argument de type 'i' n'est pas assignable au paramètre de type 'U'.


1 commentaires

Stackoverflow n'est pas un forum et ce n'est pas une réponse. Tout ce qui est important pour la question appartient à la question, pas ici.



0
votes

Je pense que votre définition est désactivée, les types ne seront pas déduits automatiquement pour correspondre à votre intention. C'est la définition que j'utiliserais: xxx

ceci utilise le même paramètre type u dans la fonction et le deuxième argument, assurant leur compatibilité. Bien sûr, l'appel sera invalide alors, car fn n'accepte que des chaînes comme argument.


0 commentaires

0
votes

La raison de celle-ci devient plus claire si vous regardez la signature de type de fngénère code> car il apparaîtrait dans un fichier .d.ts code> fichier.

const fnGeneric = <A>(fn: <B>(param: B) => B, param: A): A => fn(param);
const fn = <A>(some: A): A => some;
const result: number = fnGeneric(fn, 5); // result = 5


0 commentaires