Microsoft/TypeScript
在 GitHub 查看Multiple keys being remapped to same key causes unstable modifier propagation
Open
#62,318 创建于 2025年8月22日
BugDomain: Mapped TypesHelp Wanted
仓库指标
- Star
- (48,455 star)
- PR 合并指标
- (平均合并 6天 17小时) (30 天内合并 9 个 PR)
描述
🔎 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)