我已经做了一些搜索,无法找到解决这个特定问题的答案。任何帮助都会很棒。
我目前正在使用闭包来进行基本的依赖注入,并且我试图避免给出函数"任何&#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
答案 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
变量的类型。
希望得到一些帮助;祝你好运!