TypeScript 自动补全失败 - 对于推断的泛型来说,限制过于严格

kmbjn2e3  于 8个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(82)

Bug报告
在以下示例中,TypeScript 能够判断一组有效的字符串(如编译器错误所示),但不知何故,语言服务器的自动补全无法解析该集合。它解析为已填充的字符串集合,如下图所示的typescript playground截图

理想情况下,这种方法应该具有编辑器自动补全支持,将字符串限制为类型 Role ,而不是类型 Evidenced 。类型 Evidenced 实际上是从当前正在编辑的项目中推断出来的,因此程序员应该能够从更广泛的集合 Role 中进行选择。

🔎 搜索词

自动补全、推断、泛型、约束、“太狭窄”

🕗 版本与回归信息

  • 这是我尝试的每个版本的行为,我查阅了关于推断的常见问题解答

⏯ Playground链接

带有相关代码的playground链接

💻 代码

  1. const ROLES = ["artist", "baker", "candlestickmaker"] as const satisfies ReadonlyArray<string>;
  2. type Role = typeof ROLES[number];
  3. function tag<Evidenced extends Role>(
  4. fn: (evidence: (role: Evidenced) => void) => void,
  5. ...roles: [Evidenced, ...Evidenced[]]
  6. ) {
  7. // decorate fn
  8. return () => {;};
  9. }
  10. const decoratedFn = tag(
  11. () => {;},
  12. "artist", "baker", "candle"
  13. )

🙁 实际行为

自动补全的字符串集合最初为空,应该是由 Role 填充的。在向列表提供一个或多个条目后,它只会自动补全已经提供的字符串。

🙂 预期行为

tag 函数的参数的自动补全集合应该由 Role 填充

背景

动机示例是在使用生成器函数的故事内容( interactive fiction-style )的投资组合中。这个 Package 函数定义了一个组合函数类型,以通过在yield之间调用回调(当yielded叙事引用该角色时)或在函数最终返回时调用那些角色的回调(允许对于简单叙述的非常简洁的定义,而无需内联回调)来证明角色。
这确保至少不引用一个角色是一个错误,并提供了令人高兴的是,触及某些角色的故事元素可以立即更新显示的模型(显示哪些角色已经被证实)。
这种类型的中心目的是协助编辑器支持,因此无法进行自动补全是一个真正的死胡同。

xwmevbvl

xwmevbvl1#

感谢@RyanCavanaugh给予的信任投票,认为这可能是一个改进。
原始示例包括激励上下文(一个函数装饰器的草图,它实际上会消耗缩小的推断类型)。
然而,为了演示问题,下面有一个更简单的示例,其中narrowFn的最后一个参数的自动补全从已经推断出的Narrow中获取,而应该从Wide中获取。
除非Narrow泛型是显式的,否则参数列表实际上驱动推断,而不是遵循它。因此,自动补全应该支持将驱动Narrow的列表与其他候选项Wide一起扩展。

  1. type Wide = "artist" | "baker" | "candlestickmaker";
  2. function narrowingFn<Narrow extends Wide>(
  3. ...roles: [Narrow, ...Narrow[]]
  4. ) {
  5. }
  6. narrowingFn(
  7. // a cursor at the end of `candle` fails to autocomplete to `candlestickmaker`
  8. "artist", "baker", "candle"
  9. )

相关问题