我想获取生成器函数的返回类型。
例如
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的第一项,我就可以得到返回类型)
答案 0 :(得分:2)
有一个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"
这可以尽其所能,但可能不是您想要追求的。哦,对不起,我在这里找不到更好的答案。祝你好运!
答案 1 :(得分:1)