【问题标题】:TypeScript Wrapper Function Inferring TypesTypeScript 包装器函数推断类型
【发布时间】:2021-11-24 20:25:55
【问题描述】:

我对与数据库操作相关的函数使用了一个小实用程序/包装函数。它应该采用类型为Promise<PromiseReturnType<GENERIC>> 的特定函数fn,然后在执行之前做一些事情(这里:检查连接):

// File `A.ts`
type PromiseReturnType<T = undefined> = {success: boolean, response: T } 

const DatabaseOperation = <Fn extends (...args: any) => Promise<PromiseReturnType<Data>>, Data>(fn: (...args: any) => Promise<PromiseReturnType<Data>>) => {

    return async function (...args: Parameters<Fn>): Promise<PromiseReturnType<Data>> {
        if (!isConnected) return Promise.reject({ success: false, response: new Error("Not connected to the Database!") })

        return await fn(...args)
    }

}

然后我像这样使用它:

// File `B.ts`
const dbOperation = async (myArg: number): Promise<PromiseReturnType<string> => {

    return Promise.resolve({ success: true, response: `hello world ${myArg}` })

}


export default DatabaseOperation<typeof dbOperation, string>(dbOperation)

除了无法推断返回类型外,它工作正常。除了Promise&lt;PromiseReturnType&lt;string&gt;&gt;,它将是Promise&lt;any&gt;

使用新包装的函数将如下所示:

import dbOperation from "B.ts"

(function () {
   await dbOperation() // Type: dbOperation(myArg: number): Promise<any>
})()

关于如何解决这个问题或总体上更好地实施这个问题有什么建议吗?

感谢您的帮助,谢谢。

【问题讨论】:

  • 请分享可重现的例子
  • 调整了我的问题,希望对您有所帮助

标签: javascript typescript typescript-generics strong-typing type-constraints


【解决方案1】:

你快到了:



declare var isConnected: boolean;

type PromiseReturnType<T = undefined> = { success: boolean, response: T }

const DatabaseOperation = <Data, Fn extends (...args: any[]) => Promise<PromiseReturnType<Data>>,>(fn: (...args: any[]) => Promise<PromiseReturnType<Data>>) => {

    return async function (...args: Parameters<Fn>): Promise<PromiseReturnType<Data>> {
        if (!isConnected) return Promise.reject({ success: false, response: new Error("Not connected to the Database!") })

        return await fn(...args)
    }

}

const dbOperation = (myArg: number): Promise<PromiseReturnType<string>> =>
    Promise.resolve({ success: true, response: `hello world ${myArg}` })



const fn = DatabaseOperation(dbOperation)

const result = fn(42) // Promise<PromiseReturnType<string>>

Playground

您应该将...args 设为数组any[] 而不仅仅是any

【讨论】:

  • 感谢您的帮助 :) 我在一个开玩笑的测试文件中使用了该功能,但我没有工作。我做了一些进一步的测试,发现它以前确实有效——抱歉,之前没有检查过——但只是在我的测试文件中没有。我无法向我解释的奇怪行为。
  • 有趣的是,如果没有any[],您共享的游乐场将无法运行,但即使使用相同的版本,我的 ts 也会在我的环境中执行。什么是 TypeScript
  • 你可以在代码沙箱中分享你的例子,如果它仍然相关,我会看看
  • 解决了! ts 配置与 jest 的行为不符。对此感到抱歉。感谢您的帮助 - 谢谢! :)
  • @Isc 很高兴您解决了问题!考虑回答你自己的问题
猜你喜欢
  • 2018-08-02
  • 2020-09-09
  • 2016-07-23
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2016-12-05
  • 2020-01-23
  • 2019-09-17
相关资源
最近更新 更多