TypeScript无法推断默认参数的类型

ha5z0ras  于 9个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(147)

🔎 搜索词

infer 默认参数
函数 Package 器
函数工厂

🕗 版本与回归信息

  • 这是我在每个版本中尝试的行为,我查阅了常见问题解答
  • 我尝试到了4.0.3版本(因为在早期版本中 Generator 类型不是泛型的)

⏯ Playground链接

https://www.typescriptlang.org/play/?#code/CYUwxgNghgTiAEAzArgOzAFwJYHtVNQBEQYsA3EAHgEF4QAPDEVYAZ3jQGtUcB3VANoBdADTwASgD4AFACh4CggC540gHQbYAc1YrqASngBeSfADizElAw4YlLj35ipI2fpUO++APQAqX-AAtjhgnCDA8HAYyDD4vt4A3LKyiEQk5CDSKOjYePC+0lDG8AAMYgBGxQDkVYYA3vLwYHisOBAgahA4WtINivBQrvDe3vAAegD8jQrl8iPjUwoAvvpJK0lAA

💻 代码

  1. declare function fnDerive<A extends unknown[], R>(
  2. fn: (...args: A) => Generator<unknown, R>,
  3. ): unknown /** mocked return */;
  4. fnDerive(function *(a = 0, b = '') {
  5. console.log({
  6. a,
  7. // ^?
  8. b
  9. // ^?
  10. });
  11. });

🙁 实际行为

ab 的类型是 unknown

🙂 预期行为

ab 的类型应该是 numberstring

关于问题的额外信息

当我遇到这个问题时,我正在使用一个库 gensync,我从其中提取了最小复现案例。
请注意,如果我不使用默认参数,TypeScript 可以正确推断出 ab 的类型:

  1. declare function fnDerive<A extends unknown[], R>(
  2. fn: (...args: A) => Generator<unknown, R>,
  3. ): unknown /** mocked return */;
  4. fnDerive(function *(a?: number | undefined, b?: string | undefined) {
  5. console.log({
  6. a,
  7. // ^?
  8. b
  9. // ^?
  10. });
  11. a ??= 0;
  12. b ??= '';
  13. console.log({
  14. a,
  15. // ^?
  16. b
  17. // ^?
  18. });
  19. });

lmyy7pcs

lmyy7pcs1#

这不仅仅局限于生成器函数。它与从带有推断类型的初始化器中推断类型参数的未注解参数相关(TS playground):

  1. declare function fnDerive<A extends unknown[]>(fn: (...args: A) => void): A;
  2. const result = fnDerive(function (a = 0, b = "") {});
  3. // ^? const result: [a?: unknown, b?: unknown]
  4. declare function fnDerive2<A, B>(fn: (a: A, b: B) => void): [A, B];
  5. const result2 = fnDerive2(function (a = 0, b = "") {});
  6. // ^? const result2: [unknown, unknown]

它还与这里可用的上下文签名有关。这涉及到我在这里改进的内容: #56506 。这个PR在展示的情况中没有破坏它,但也没有改善它。
所以这里的问题也是 - 如何区分这两种情况?在某些情况下,应该优先使用上下文参数类型。也许可以基于 checkMode & CheckMode.Inferential 来实现,或者当参数类型是类型变量时,基于未示例化的上下文签名。
我很乐意尝试这个,但我有很多事情要尝试,所以不能保证 😅

k75qkfdt

k75qkfdt2#

这并不特定于生成器函数。
更新标题和搜索词以反映这一点~

相关问题