microsoft / microsoft/TypeScript
[TypeScript] Mapped Types with Template Literal Keys Do Not Preserve Type Declaration References
未关闭
还没有人认领这个 Issue。
Domain: LS: Signature Help
Experience Enhancement
Help Wanted
Suggestion
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.3k
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 132
描述
Does this issue occur when all extensions are disabled?: Yes
- VS Code Version: 1.96.4 (Universal)
- OS Version: Darwin arm64 23.6.0 (macOS Sonoma 14.7.2)
- TypeScript Version: 5.7.3
When using Mapped Types with template literal transformations on interface fields, VSCode does not retain the original type reference. This makes it impossible to use “Go to Definition” to navigate from the transformed key back to its original declaration. WebStorm correctly maintains this reference, but VSCode does not.
Steps to Reproduce:
interface Source {
alpha: number;
beta: string;
}
// Transforming interface field names with a suffix
type Transformed<T> = {
[K in keyof T as `${K & string}Suffix`]: () => T[K];
};
type Result = Transformed<Source>;
/*
Expected:
{
alphaSuffix: () => number;
betaSuffix: () => string;
}
*/
const obj: Result = {
alphaSuffix: () => 42,
betaSuffix: () => "hello",
};
// ❌ In VSCode, "Go to Definition" on `alphaSuffix` does not navigate to `alpha` in `Source`
obj.alphaSuffix();
Expected Behavior
- “Go to Definition” on alphaSuffix should navigate to alpha in Source.
- VSCode should retain the reference between transformed keys and their original interface field names.
- This works as expected in WebStorm, where alphaSuffix correctly links back to alpha.
Actual Behavior
- VSCode treats transformed keys as completely new identifiers, losing the connection to their original interface fields.
- “Go to Definition” does not work for mapped types with template literal keys.
- WebStorm successfully tracks the transformation and allows navigation to alpha.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
使用 TypeScript 5.7.3 复现 mapped type 示例,并测试从 alphaSuffix 到 Source.alpha 的 Go to Definition。首先跟踪 TypeScript language service 对 mapped type 和模板字面量键的定义查找;完成的标准是转换后的键能够跳转到其原始接口字段,并且该行为有回归测试覆盖。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- typescript
- 领域
- developer-experience
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100