如何为可能异步的CallableFunction数组进行TypeScript类型标注?
正确标注包含同步/异步函数的数组类型
你之前的类型标注犯了一个概念错误:把返回Promise的异步函数和包裹着函数的Promise搞混了。Promise<CallableFunction>是一个Promise对象,本身不能被调用,这也是VSCode报错的原因——数组里的元素可能是Promise,而Promise不是可调用的。
正确的类型标注方式
异步函数本质还是函数,只是调用后返回Promise,它本身属于CallableFunction的范畴。所以如果只是需要接受同步/异步函数组成的数组,你最初的CallableFunction[]其实已经够用,因为await可以自动处理非Promise返回值:
export const provide = async (callables: CallableFunction[]) => { for (const callable of callables) { await callable() } }
如果想要更精确地明确函数的返回值类型(强调可以是普通值或Promise),可以定义一个更清晰的类型别名:
// 定义同步或异步无参函数类型 type SyncOrAsyncCallable = () => unknown | Promise<unknown>; export const provide = async (callables: SyncOrAsyncCallable[]) => { for (const callable of callables) { await callable(); } };
如果你的函数需要支持带参数的场景,还可以泛化这个类型:
// 泛型版本:支持自定义参数和返回值类型 type SyncOrAsyncFunc<TArgs extends any[] = [], TReturn = unknown> = (...args: TArgs) => TReturn | Promise<TReturn>; // 无参场景下直接使用SyncOrAsyncFunc[]即可 export const provide = async (callables: SyncOrAsyncFunc[]) => { for (const callable of callables) { await callable(); } };
为什么之前的写法报错?
你写的callables: CallableFunction[] | Promise<CallableFunction>[]意味着数组里的元素要么是函数,要么是会解析为函数的Promise。当TypeScript进行类型检查时,它无法确定当前遍历到的callable是函数还是Promise,而Promise不能被()调用,因此抛出“表达式不可调用”的错误。
内容的提问来源于stack exchange,提问作者jdion84
相关产品推荐
相关产品推荐

