建议:如果TypeScript能够从异步生成器中推断出类型,那将是非常棒的。以下是有效的JavaScript代码,因此我认为它应该是有效的TypeScript,并且x
的类型应该被推断出来。今天它在Parameter 'x' implicitly has 'any' type.
上失败了。
// 无效的TypeScript代码
async function*
async function forever(x) {
for await (const unused of x) {
void unused;
}
}
async function* test() {
for (;;) {
await something();
yield;
}
}
forever(test());
(): any;
// 有效的JavaScript代码
async function* `x`(): any;
🔍 搜索词
async generator, async iterator, type inference, 推断类型
✅ 可实现性检查清单
我的建议满足以下准则:
- 这不会对现有的TypeScript/JavaScript代码造成破坏性的更改
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型发出不同的JS的情况下实现
- 这不是一个运行时特性(例如库功能、带有JavaScript输出的非ECMAScript语法、JS的新语法糖等)
- 这个特性将与TypeScript's Design Goals的其他部分保持一致。
⭐ 建议
将x
的类型视为“任何异步迭代器都会做的”,从而包括任何异步生成器函数。
📃 激励示例
我自己的使用场景...永远/后台(异步)进程/
💻 用例
今天,我需要显式地为这个类型编写代码,这显得有些冗长。从长远来看,它将允许组合异步函数,就像类型推断帮助组合普通函数一样。我知道对于异步可迭代对象/迭代器/生成器进行类型推断会带来很多问题,比如:
- 类型缩小,如async, await, loop, implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer. #36687或类似的方式
- yield表达式的返回类型Feature request: typed yield expression #36967
- 生成器yield的类型Generator: infer the type of yield expression based on yielded value #32523
3条答案
按热度按时间hvvq6cgz1#
这听起来像是基于使用场景的推断,在#15114上进行了更广泛的讨论。我们推断可迭代值、异步值,或者特别是异步可迭代变量的类型,但不推断其他类型的值,这将是非常奇怪的。
im9ewurl2#
☝🏿 这是一张已关闭并锁定的旧票...
我认为部分类型推断(一个异步事物;或一个异步生成器产生任何值)也可能是有用的...
bvhaajcl3#
这是一张已经关闭和锁定的旧票...
对,我的意思是,我们不太可能朝这个方向发展,许多相同的问题在这里也是相关的。即使我们能为一个子集解决它,这也是一个相当不一致的推理规则集。