gpt4 book ai didi

typescript :函数联合

转载 作者:搜寻专家 更新时间:2023-10-30 21:48:07 24 4
gpt4 key购买 nike

有两种函数类型,一种返回string另一个返回 Promise<string> .现在我想要一个函数来包装它们,但我必须在调用 fn 时区分每一个。

type FuncTypes = (...args: any[]) => string | Promise<string>

function callFunc(fn: FuncTypes, ...args: any[]) {
// distinguish fn returns string or Promise<string>
// if fn returns string
return new Promise<string>(r => r(fn.call(this, ...args)))
// if fn returns a Promise
return fn.call(this, ...args)
}

另一种情况是过载:

type FuncA = (...args: any[]) => string
type FuncB = (...args: any[]) => Promise<string>

function callFunc(fn: FuncA, ...args: any[]): Promise<string>
function callFunc(fn: FuncB, ...args: any[]): Promise<string>
function callFunc(fn: any, ...args: any[]): Promise<string> {
// if fn is instanceof FuncA
// do sth.
// else if fn is instanceof FuncB
// do sth
}

虽然我们可以简单地使用const returned = fn(..args); typeof returned === 'string'检查返回的类型,这不是一个通用的解决方案。如果函数类型是 () => AnInterface|AnotherInterface , 使用 typeof 很难检查返回类型或 instanceof .

有什么通用的方法可以区分它们吗?还是应该为每种类型编写两个函数?

最佳答案

在那个特定情况下

There are two function types, one returns string and other one returns a Promise. Now I'd like to have a function to wrap them, but I have to distinguish each one while invoking fn

在那种特定的情况下,callFunc 可以是这样的:

function callFunc(fn: FuncTypes, ...args: any[]) {
return <Promise<string>>Promise.resolve(fn.call(this, ...args));
}

如果 fn 返回一个 promise ,来自 Promise.resolve 的 promise 将被解析为 fn 返回的 promise (它将等待 promise 以同样的方式解决和解决);如果没有,您将得到一个以 fn 的返回值作为其解析值的已兑现的 promise 。

在一般情况下

Is there any general way to distinguish them?

不是在运行时,除非您以某种方式注释它们(稍后会详细说明)。 TypeScript 的类型信息只是编译时的。

or should I write two functions for each type?

这可能是最好的。

您可以注释这些函数,例如通过在它们上放置一个属性来指示它们的返回类型是什么:

function delay(ms: number, value: string): Promise<string> {
return new Promise<string>(resolve => setTimeout(resolve, ms, value));
}
(<any>delay).returnValue = "Promise<string>";

此时,您正在复制类型信息(一次用于 TypeScript,另一次用于您自己的代码)。

所以您编写两个函数的解决方案可能是最好的。

关于 typescript :函数联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com