-
Notifications
You must be signed in to change notification settings - Fork 13k
Open
Description
🔎 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 FirstOptional
has optional propertyfoo
type FirstRequired
has required propertyfoo
🙂 Expected behavior
type FirstOptional
and type FirstRequired
results in same type. I would expect it to be same as type FirstRequired
type 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)
Metadata
Metadata
Assignees
Labels
No labels