我正在做一个简单的memoize
函数,它的作用是接受一个函数,并在缓存返回结果的地方做一些魔法。但基本上返回函数的类型memoize
与给定的完全相同。但我遇到了错误,我不知道如何修复。当使用该函数并忽略我遇到的错误时,这些类型可以工作。
我已经制作了两个函数来展示我的问题,从我的角度来看,两种类型都应该有效,但我越来越接近第二种实现,但它仍然不起作用。
这是一个链接TypeScript 游乐场 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAWwKbLjAXqgjAHgDFFUAPKVMAEwGdEAKAOmYEMAnAcxoC5EWwAngG0AugEpEAXgB8iAAps4yGDVT5+A6dPqhIvQmP2IA3gChEFxG1RQQbJE1acaEmYl0RHjdlzGmAvqamHrAIKOiYOABMRCTklLQMzN7OvBqirrIKSipqGlo64BD6hklOXLxy7CxoFGw0RNKZiABKNnZgACoCAA5qhLJmllbt9mUpvlKyHl4+LgFBEAg0UO4w9auS4RjYePT0zcb+EgD0J4gAwko9ADYsMGA0pkuPq6ovVFLbkXssNAKQBiHY6IM6IADqcDYAGsni8VogoAALdafLZoHbRfbA07nK7IW73R7PZarYBwOzIr4Yn5Reh-AEQIFTEwgsGQmFPIA但为了防止它过期,我将发布一些代码和一些显示错误的图片:
function memoize1<F extends (...args: any[]) => Promise<any>>(func: F): F {
return (...args) => func(...args)
}
function memoize2<F extends (...args: any[]) => Promise<any>>(func: F): (...args: Parameters<F>) => ReturnType<F> {
return (...args) => func(...args)
}
const first = memoize1(() => {}) // Complains
const second = memoize1(async () => {}) // Works
const third = memoize2(() => {}) // Complains
const fourth = memoize2(async () => {}) // Works
这是错误图像,其中一张用于第一个例子 https://i.stack.imgur.com/GiAfI.png and 第二个例子 https://i.stack.imgur.com/MpdRe.png
有一个有趣的issue https://github.com/microsoft/TypeScript/issues/35858在 github 上根据你的问题中提到的这种行为。显式转换为所需类型应该可以消除由以下函数引起的编译错误:
function memoize1<F extends (...args: any[]) => Promise<any>>(func: F): F {
return ((...args) => func(...args)) as F
}
function memoize2<F extends (...args: any[]) => Promise<any>>(func: F): (...args: Parameters<F>) => ReturnType<F> {
return (...args) => func(...args) as ReturnType<F>
}
memoize1 调用失败的原因是给定的参数函数没有返回 memoize1 指定的承诺F extends (...args: any[]) => Promise<any>
所以打电话memoize1(() => {})
传递一个返回空对象而不是承诺的函数。通过使用 async 语句,函数返回类型更改为 Promise。这就是为什么memoize1(async () => {})
work.
例如:const first = memoize1(() => new Promise((resolve, reject)=> {})
传递一个返回 Promise 并会编译的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)