如何提取异步或同步生成器的内部返回类型?
提取生成器函数的内部返回类型(类似Promise的Awaited工具)
在处理Promise异步函数时,我们可以通过Awaited<ReturnType<typeof foo>>轻松获取函数的实际返回值类型,但对于同步生成器(function*)或异步生成器(async function*),TypeScript并没有内置类似Awaited的工具类型来直接提取其内部返回的类型。
自定义工具类型实现需求
我们可以自己编写一个条件类型来处理同步和异步生成器的情况:
type GeneratorReturnType<T extends Generator | AsyncGenerator> = T extends AsyncGenerator<any, infer R, any> ? Awaited<R> : T extends Generator<any, infer R, any> ? R : never;
使用示例
对应你给出的代码场景,这样就能提取生成器的内部返回类型:
async function* foo() { yield 1; return "async-result"; } function* bar() { yield 2; return "sync-result"; } // 类型为 string let asyncReturnValue: GeneratorReturnType<ReturnType<typeof foo>>; // 类型为 string let syncReturnValue: GeneratorReturnType<ReturnType<typeof bar>>; // 联合类型下,类型仍为 string let combinedReturnValue: GeneratorReturnType<ReturnType<typeof foo | typeof bar>>;
类型逻辑说明
- 首先判断传入的类型
T是否为AsyncGenerator,若是则提取其返回类型参数R,再通过Awaited处理异步生成器返回的Promise<R>,得到实际的返回值类型。 - 若
T是普通的Generator,则直接提取其返回类型参数R即可。
内容的提问来源于stack exchange,提问作者Mahesh Bansod
相关产品推荐
相关产品推荐

