2017-10-08 84 views
0

我已经做了一些搜索,找不到似乎解决这个问题的答案。任何帮助都会很棒。在闭包中获取函数的类型

我目前正在使用闭包进行基本的依赖注入,我试图避免函数获得“任何”;

可以说我有以下几点:

// DB-fns.ts

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

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

我看不出我是怎么得到的类型erySql在user-fns.ts

回答

1

那么依赖界面,你已经宣布makeQuerySql回报<T>(query: string, args?: any) => Promise<T>,所以如果你definie这样的:

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

然后你的代码index.ts类型检查。

据我所知,这就是你说的问题的答案。


虽然我很怀疑。 makeQuerySql真的会产生一个<T>(query: string, args?: any) => Promise<T>?这是一个函数,返回Promise<T>任何类型值T,尽管事实上这两个函数的参数都与T类型没有任何关系。它是如何做到的?

您还需要在您的makeQuerySql调用中指定SqlPool变量的类型,否则它将隐式地为any。喜欢的东西

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

其中TypeOfSqlPool被替换为你想要的SqlPool变量是类型。

希望这有些帮助;祝你好运!

+0

池类型只是有这样的例子占位符,对部分无后顾之忧;) 的是毫无关系的论据,它只是一个普通的查询SQL数据库,所以调用者将被指定的预期返回类型。 我实际上最终采取了一种稍微不同的路由来声明一个类型为'export type QuerySql = (query:string,args ?: any)=> Promise ;' 但是我会将您的答案标记为正确它本质上是一回事。 我只是希望我不必重新宣布fn的类型是全部。 :( – Jed