Bug报告
在以下示例中,TypeScript 能够判断一组有效的字符串(如编译器错误所示),但不知何故,语言服务器的自动补全无法解析该集合。它解析为已填充的字符串集合,如下图所示的typescript playground截图
理想情况下,这种方法应该具有编辑器自动补全支持,将字符串限制为类型 Role
,而不是类型 Evidenced
。类型 Evidenced
实际上是从当前正在编辑的项目中推断出来的,因此程序员应该能够从更广泛的集合 Role
中进行选择。
🔎 搜索词
自动补全、推断、泛型、约束、“太狭窄”
🕗 版本与回归信息
- 这是我尝试的每个版本的行为,我查阅了关于推断的常见问题解答
⏯ Playground链接
带有相关代码的playground链接
💻 代码
const ROLES = ["artist", "baker", "candlestickmaker"] as const satisfies ReadonlyArray<string>;
type Role = typeof ROLES[number];
function tag<Evidenced extends Role>(
fn: (evidence: (role: Evidenced) => void) => void,
...roles: [Evidenced, ...Evidenced[]]
) {
// decorate fn
return () => {;};
}
const decoratedFn = tag(
() => {;},
"artist", "baker", "candle"
)
🙁 实际行为
自动补全的字符串集合最初为空,应该是由 Role
填充的。在向列表提供一个或多个条目后,它只会自动补全已经提供的字符串。
🙂 预期行为
tag
函数的参数的自动补全集合应该由 Role
填充
背景
动机示例是在使用生成器函数的故事内容( interactive fiction-style )的投资组合中。这个 Package 函数定义了一个组合函数类型,以通过在yield之间调用回调(当yielded叙事引用该角色时)或在函数最终返回时调用那些角色的回调(允许对于简单叙述的非常简洁的定义,而无需内联回调)来证明角色。
这确保至少不引用一个角色是一个错误,并提供了令人高兴的是,触及某些角色的故事元素可以立即更新显示的模型(显示哪些角色已经被证实)。
这种类型的中心目的是协助编辑器支持,因此无法进行自动补全是一个真正的死胡同。
1条答案
按热度按时间xwmevbvl1#
感谢@RyanCavanaugh给予的信任投票,认为这可能是一个改进。
原始示例包括激励上下文(一个函数装饰器的草图,它实际上会消耗缩小的推断类型)。
然而,为了演示问题,下面有一个更简单的示例,其中
narrowFn
的最后一个参数的自动补全从已经推断出的Narrow
中获取,而应该从Wide
中获取。除非
Narrow
泛型是显式的,否则参数列表实际上驱动推断,而不是遵循它。因此,自动补全应该支持将驱动Narrow
的列表与其他候选项Wide
一起扩展。