gpt4 book ai didi

typescript - 有没有办法获得生成器函数的返回类型?

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:47 25 4
gpt4 key购买 nike

我想获取生成器函数的返回类型。
例如

function* test(){
yield 'a';
yield 123;

return true;
}

// what I'm trying to get
type A = GetGeneratorReturn<test>; // -> A has type boolean

我现在在做什么。

type B = ReturnType<ReturnType<typeof test>['next']>['value'];
// B has type `true | "a" | 123`

(我以为如果我得到 Union 类型 B 的第一个项目,我就可以得到返回类型)

最佳答案

有一个open issue其中讨论了这个问题,但它已经很老了,而且看起来没有人关注它,因为其他一些问题已经得到解决。我看到 recent mentions它在这里和那里。最相关的问题似乎是 this one .如果这对你很重要,你可能想去 GitHub 给这些问题点个赞。

目前看来,TypeScript 中的生成器类型只能让您访问 yield 类型和 return 类型的无差别联合。不幸的是,您不能依赖联合类型的排序。它是编译器的一个实现细节;自 X | Y 等同于 Y | X,编译器可以随意将一个更改为另一个。有时确实如此:

function* test() {
yield 'a';
yield 123;
return true;
} // function test(): IterableIterator<true | "a" | 123>

function* oops() {
yield true;
yield 123;
return 'a'
} // function oops(): IterableIterator<true | "a" | 123>

oops() 的返回类型与test() 的返回类型完全相同。这意味着您提取联合的第一个/最后一个元素的想法是行不通的。

可能有一个解决方法会有所帮助,特别是如果您可以弄乱生成器定义并且不介意一些幻像类型:

type Returnable<T> = { __returnedType?: T } & T
const ret = <T>(t: T) => t as Returnable<T>;
type GeneratorReturn<T extends (...args: any) => IterableIterator<any>> =
ReturnType<T> extends IterableIterator<infer I> ?
NonNullable<Extract<I, Returnable<unknown>>['__returnedType']> : never

function* test() {
yield 'a';
yield 123;
return ret(true); // only use ret() here
}

function* oops() {
yield true;
yield 123;
return ret('a'); // only use ret() here
}

type TestRet = GeneratorReturn<typeof test>; // true
type OopsRet = GeneratorReturn<typeof oops>; // "a"

就目前而言,它是有效的,但可能不是您想要追求的东西。哦,抱歉,我在这里找不到更好的答案。祝你好运!

关于typescript - 有没有办法获得生成器函数的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com