🔎 搜索词
infer 默认参数
函数 Package 器
函数工厂
🕗 版本与回归信息
- 这是我在每个版本中尝试的行为,我查阅了常见问题解答
- 我尝试到了4.0.3版本(因为在早期版本中
Generator
类型不是泛型的)
⏯ Playground链接
https://www.typescriptlang.org/play/?#code/CYUwxgNghgTiAEAzArgOzAFwJYHtVNQBEQYsA3EAHgEF4QAPDEVYAZ3jQGtUcB3VANoBdADTwASgD4AFACh4CggC540gHQbYAc1YrqASngBeSfADizElAw4YlLj35ipI2fpUO++APQAqX-AAtjhgnCDA8HAYyDD4vt4A3LKyiEQk5CDSKOjYePC+0lDG8AAMYgBGxQDkVYYA3vLwYHisOBAgahA4WtINivBQrvDe3vAAegD8jQrl8iPjUwoAvvpJK0lAA
💻 代码
declare function fnDerive<A extends unknown[], R>(
fn: (...args: A) => Generator<unknown, R>,
): unknown /** mocked return */;
fnDerive(function *(a = 0, b = '') {
console.log({
a,
// ^?
b
// ^?
});
});
🙁 实际行为
a
和 b
的类型是 unknown
。
🙂 预期行为
a
和 b
的类型应该是 number
和 string
。
关于问题的额外信息
当我遇到这个问题时,我正在使用一个库 gensync
,我从其中提取了最小复现案例。
请注意,如果我不使用默认参数,TypeScript 可以正确推断出 a
和 b
的类型:
declare function fnDerive<A extends unknown[], R>(
fn: (...args: A) => Generator<unknown, R>,
): unknown /** mocked return */;
fnDerive(function *(a?: number | undefined, b?: string | undefined) {
console.log({
a,
// ^?
b
// ^?
});
a ??= 0;
b ??= '';
console.log({
a,
// ^?
b
// ^?
});
});
2条答案
按热度按时间lmyy7pcs1#
这不仅仅局限于生成器函数。它与从带有推断类型的初始化器中推断类型参数的未注解参数相关(TS playground):
它还与这里可用的上下文签名有关。这涉及到我在这里改进的内容: #56506 。这个PR在展示的情况中没有破坏它,但也没有改善它。
所以这里的问题也是 - 如何区分这两种情况?在某些情况下,应该优先使用上下文参数类型。也许可以基于
checkMode & CheckMode.Inferential
来实现,或者当参数类型是类型变量时,基于未示例化的上下文签名。我很乐意尝试这个,但我有很多事情要尝试,所以不能保证 😅
k75qkfdt2#
这并不特定于生成器函数。
更新标题和搜索词以反映这一点~