【发布时间】:2023-01-12 19:46:24
【问题描述】:
假设如下:
type GenericFunc<T> = () => Promise<T>
interface FuncWithModifier<T> extends GenericFunc<T> {
modifier: GenericFunc<T>
}
const wrapFunction = <T> (func: GenericFunc<T>): FuncWithModifier<T> => {
const modifier: GenericFunc<T> = async () => func()
return Object.assign(func, { modifier })
}
现在我可以创建带有修饰符的函数,如下所示:
const stringFunc: FuncWithModifier<string> = wrapFunction(async () => 'foo')
const str1: string = await stringFunc()
const str2: string = await stringFunc.modifier()
它也可以在没有显式类型注释的情况下工作:
const implicitStringFunc = wrapFunction(async () => 'foo')
const str3: string = await implicitStringFunc()
const str4: string = await implicitStringFunc.modifier()
我现在想要的是一个通用函数,例如就像是:
// doesn't work, invalid syntax!
const genericFunc = <T = unknown> wrapFunction(async () => null as any)
const num1: number = await genericFunc<number>()
const num2: number = await genericFunc.modifier<number>()
const bool1: boolean = await genericFunc<boolean>()
const bool2: boolean = await genericFunc.modifier<boolean>()
但是,似乎无法保留被调用函数(上面的wrapFunction)的类型参数,而是将其应用于结果。还有另一种方法可以实现这一目标吗?
【问题讨论】:
-
您可以从
wrapFunction参数推断返回类型。不知道为什么你需要额外的通用。但是,如果你需要,你可以尝试this,但它只适用于any. I just not sure whether you want to use any or not
标签: typescript generics