比如我的场景是这样的
async function doRequest({ type }) {
}
function wrapper<T>(fn: (arg: T) => Promise<void>): (arg: T) => Promise<void>{
return async function(...args) {
await fn.apply(null, args);
};
}
const myDoRequest = wrapper(doRequest);
这样写,doRequest
的类型( (arg: { type: any; }) => Promise<void>
)符合我的预期。
现在我想扩展一下 wrapper
到支持多个参数,但是下述两种写法都是不行的
async function doRequest({ type, }, { no }) {
}
function wrapper<T>(fn: (...args: T[]) => Promise<void>): (...arg: T[]) => Promise<void>{
return async function(...args) {
await fn.apply(null, args);
};
}
const myDoRequest = wrapper(doRequest);
async function doRequest({ type, }, { no }) {
}
function wrapper<T extends Function>(fn: T): T{
return async function(...args) {
await fn.apply(null, args);
};
}
const myDoRequest = wrapper(doRequest);
这个 wrapper
内部会有一个微妙的报错(虽然不影响返回的类型)
问题 这种高阶函数正确的类型是什么呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.