2017-10-08 2 views
0

J'ai fait quelques recherches et je ne trouve pas de réponse qui semble résoudre ce problème particulier. Toute aide est la bienvenue. J'utilise actuellement des fermetures pour l'injection de dépendances de base et j'essaie d'éviter que les fonctions soient données "any";Obtenir le type de fonction à l'intérieur de la fermeture

Disons que je donne les résultats suivants:

// db-fns.ts

export const makeQuerySql = ({pool: SqlPool}) => 
    <T>(query: string, args?: any): Promise<T> => { 
     // fn code 
    } 

// user-fns.ts

export const makeGetUser = ({querySql}: Dependencies) => (userId: number) => { 
    // fn code 
} 
export interface Dependencies { 
    querySql: ???? 
} 

// index.ts

import {makeQuerySql} from 'db-fns.ts'; 
import {makeGetUser} from 'user-fns.ts'; 
const querySql = makeQuerySql({pool}); 
const getUser = makeGetUser({querySql}); 

Je ne vois pas comment j'obtiendrais le typeof erySql dans l'interface de dépendances dans user-fns.ts

Répondre

1

Eh bien, vous avez déclaré que makeQuerySql renvoie un <T>(query: string, args?: any) => Promise<T>, donc si vous definie comme ceci:

export interface Dependencies { 
    querySql: <T>(query: string, args?: any) => Promise<T> 
} 

Ensuite, votre code dans index.ts contrôles de type. Pour autant que je sache, c'est la réponse à votre question comme indiqué.


Je suis sceptique cependant. Est-ce que makeQuerySql produit vraiment un <T>(query: string, args?: any) => Promise<T>? Ce serait une fonction qui renvoie Promise<T> pour valeur de type de T, malgré le fait qu'aucun des paramètres de la fonction ont quelque chose à voir avec le type T. Comment fait-il cela? Vous devez également spécifier un type pour la variable SqlPool dans votre appel makeQuerySql ou any implicitement. Quelque chose comme

({ pool: SqlPool }: { pool: TypeOfSqlPool }) => 
    <T>(query: string, args?: any): Promise<T> 

TypeOfSqlPool est remplacé par le type que vous souhaitez que la variable SqlPool soit.

J'espère que cela vous aidera; bonne chance!

+0

Le type de piscine était juste là pour que l'espace réservé dans l'exemple, pas de soucis sur cette partie;) Le est sans rapport avec les arguments qu'il est simplement une requête générique db SQL, de sorte que l'appelant spécifieront l'attend type de retour. J'ai effectivement pris une route légèrement différente en déclarant un type en tant que tel type d'exportation QuerySql = (requête: chaîne, args ?: any) => Promesse ; ' Cependant, je vais marquer votre réponse aussi correcte que c'est essentiellement la même chose. J'espérais juste que je n'aurais pas à redéclarer les typings de la fn est tout. :( – Jed