在闭包内获取函数类型

时间:2017-10-08 23:24:01

标签: typescript dependency-injection

我已经做了一些搜索,无法找到解决这个特定问题的答案。任何帮助都会很棒。

我目前正在使用闭包来进行基本的依赖注入,并且我试图避免给出函数"任何&#34 ;;

假设我有以下内容:

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

我无法看到如何在user-fns.ts

的依赖关系界面中获取typeof querySql

1 个答案:

答案 0 :(得分:1)

嗯,您已宣布makeQuerySql会返回<T>(query: string, args?: any) => Promise<T>,所以如果您这样定义:

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

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

据我所知,这是你提出的问题的答案。

我虽然持怀疑态度。 makeQuerySql真的产生了<T>(query: string, args?: any) => Promise<T>吗?这将是一个函数,为{em>任何类型的Promise<T>值返回T,尽管事实上这两个函数的参数都没有与输入T。它是如何做到的?

您还需要在SqlPool来电中指定makeQuerySql变量的类型,或者隐式地any。像

这样的东西
({ pool: SqlPool }: { pool: TypeOfSqlPool }) =>
  <T>(query: string, args?: any): Promise<T>

其中TypeOfSqlPool替换为您希望SqlPool变量的类型。

希望得到一些帮助;祝你好运!