microsoft / microsoft/TypeScript
Multiple keys being remapped to same key causes unstable modifier propagation
未关闭
还没有人认领这个 Issue。
Bug
Domain: Mapped Types
Help Wanted
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.3k
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 132
描述
🔎 Search Terms
Mapped Types, Key Remapping
🕗 Version & Regression Information
- This has been happening since first release of key remapping at 4.1 (tested with v4.1.5 at Playground) until nightly (tested with v6.0.0-dev.20250822 at Playground).
⏯ Playground Link
💻 Code
type RemapKeyToInitialPart<T> = {
[K in keyof T as K extends `${infer First}.${infer _Rest}` ? First : K]: null;
};
type FirstOptional = RemapKeyToInitialPart<{
// ^?
"foo.bar"?: string;
"foo.baz": number;
}>;
type FirstRequired = RemapKeyToInitialPart<{
// ^?
"foo.baz": number;
"foo.bar"?: string;
}>;
🙁 Actual behavior
type FirstOptional and type FirstRequired results in different types:
type FirstOptionalhas optional propertyfootype FirstRequiredhas required propertyfoo
🙂 Expected behavior
type FirstOptional and type FirstRequired results in same type. I would expect it to be same as type FirstRequiredtype FirstOptional.
Additional information about the issue
My motivation was to implement a utility type Expand<T> which transforms { "foo.bar": number } to { foo: { bar: number } } (playground)
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
使用链接的 TypeScript Playground 重现两个映射类型示例,并比较 FirstOptional 与 FirstRequired。调查编译器的键重映射行为,然后添加一个回归测试,表明两种声明顺序都会产生相同的属性可选性;测试以完全相同的结果通过即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- typescript
- 领域
- compilers
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 42/100