2017-10-08 2 views
0

Ich habe einige Suche herum und kann keine Antwort finden, die dieses spezielle Problem zu lösen scheint, die ich habe. Jede Hilfe wäre großartig.Art der Funktion innerhalb der Schließung

Ich verwende derzeit Schließungen für grundlegende Abhängigkeits-Injektion und ich versuche zu vermeiden, Funktionen erhalten "any";

Können sagen, ich habe folgendes:

// 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}); 

Ich kann nicht sehen, wie ich den Typ von Qu bekommen würde erySql in der Abhängigkeiten Schnittstelle in user-fns.ts

Antwort

1

Nun, haben Sie erklärt, dass makeQuerySql kehrt ein <T>(query: string, args?: any) => Promise<T>, also wenn Sie es so definie:

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

Dann wird Ihr Code in index.ts Typprüfungen.

Soweit ich sagen kann, das ist die Antwort auf Ihre Frage wie gesagt.


Ich bin aber skeptisch. Produziert makeQuerySql wirklich eine <T>(query: string, args?: any) => Promise<T>? Das wäre eine Funktion, die einen 0123/für beliebigen Typ Wert von T zurückgibt, trotz der Tatsache, dass keiner der Parameter der Funktion etwas mit dem Typ T zu tun hat. Wie macht es das?

Sie müssen auch einen Typ für die SqlPool Variable in Ihrem makeQuerySql Aufruf angeben, oder es wird any implizit sein. So etwas wie

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

wo TypeOfSqlPool mit dem Typ Sie das wollen ersetzt SqlPool variabel zu sein.

Hoffen, dass das eine Hilfe ist; Viel Glück!

+0

Der Pool Typ war es gerade so als Platzhalter in dem Beispiel, keine Sorgen auf diesem Teil;) Die ist auf die Argumente in keinem Zusammenhang, wie es auf SQL-Datenbank nur eine generische Abfrage ist, so wird der Anrufer die erwartet werden, die Angabe Rückgabetyp. Ich endete tatsächlich eine etwas andere Route bei der Deklaration eines Typs als solche Exportart QuerySql = (Abfrage: String, Args ?: alle) => Versprechen ; ' aber ich werde Ihre Antwort als richtig markieren Es ist im Wesentlichen das Gleiche. Ich hatte nur gehofft, ich würde nicht die Typisierungen der Fn alles neu deklarieren müssen. :( – Jed

Verwandte Themen