我正在用TypeScript重写一个旧的浏览器扩展,遇到了一个非常古怪的"方便"函数,它旨在包装另一个函数,以有效地"挂钩"到该函数.当我打算在生产代码中替换这个函数时,我很好奇是否有可能以满足TS的方式编写这个函数,因为我的引擎一直在抱怨.
这是我得到的(主观上)最好的结果
type GetReturnType<Type> = Type extends (...args: never[]) => infer Return ? Return : never;
type GetArgsType<Type> = Type extends (...args: infer Args) => any ? Args : never
export function wrapFunction<T, K extends keyof T>(
parent: T,
name: K,
newFunction: (
oldFn: T[K],
...args: GetArgsType<T[K]>
) => GetReturnType<T[K]>
) {
var oldFunction = parent[name]
parent[name] = (...args:GetArgsType<T[K]>) => {
return newFunction(oldFunction, ...args)
}
return parent[name]
}
在此情况下,我的发动机在从parent[name] = ...
开始的生产线上发出以下投诉
Type '(...args: GetArgsType<T[K]>) => GetReturnType<T[K]>' is not assignable to type 'T[K]'.
'T[K]' could be instantiated with an arbitrary type which could be unrelated to '(...args: GetArgsType<T[K]>) => GetReturnType<T[K]>'.