microsoft / microsoft/TypeScript
Strange runtime caching bug involving `as const` and `const T` generic
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
🔎 Search Terms
is:issue runtime caching as const
🕗 Version & Regression Information
- This is a type checker runtime inconsistency
- This is the behavior in every version I tried since const generics were introduced
⏯ Playground Link
💻 Code
type ObjectFromEntries<T> = T extends readonly [infer Key extends string | number | symbol, infer Value][]
? { [key in Key]: Value }
: never;
type KeyValuePairs<T> = {
[K in keyof T]: [K, T[K]];
}[keyof T];
export function mapObjectEntries<
const T extends object,
const TMapped extends [string | number | symbol, unknown],
>(
obj: T,
mapper: ([a, b]: KeyValuePairs<T>) => TMapped,
): ObjectFromEntries<TMapped[]> {
//@ts-expect-error Already properly typed through the signature
return Object.fromEntries(Object.entries(obj).map(mapper));
}
const test = mapObjectEntries({ a: 1, b: 2 }, ([x, y]) => [x, y]);
Here is a screencast illustrating the issue:
https://github.com/microsoft/TypeScript/assets/7313176/4875d16f-6a42-47a4-8f9c-2bd165de7a2c
🙁 Actual behavior
Type checker is context sensitive. When I add an as const behind the expression (see screencast), it compiles fine even after I remove the as const again.
🙂 Expected behavior
Consistency
Additional information about the issue
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked TypeScript Playground reproduction, focusing on the generic signature using const T and the effect of adding and removing as const. Trace the type-checker path responsible for the inconsistent result and verify that repeated checks produce the same outcome without relying on the temporary assertion.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100