Microsoft/TypeScript

Strange runtime caching bug involving `as const` and `const T` generic

Open

#58,351 opened on Apr 29, 2024

View on GitHub
 (1 comment) (0 reactions) (0 assignees)TypeScript (6,726 forks)batch import
Domain: check: Error InstabilityHelp WantedPossible Improvement

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (Avg merge 6d 17h) (9 merged PRs in 30d)

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

https://www.typescriptlang.org/play/?target=99#code/C4TwDgpgBA8gRgKwgY2AMQE4HsC2BRAO2AwEsIBnAHgBUA+KAXimqggA9gICATcqDCAENuWAgBsQUANokCAMwgYoAaQiT2nHn3LFZAcygAfKAQCuOOIqNRyIC1jEAaKLIVKAaoLGmIAXSm+AFBQUAD8UADe0gDWai4EKmq+AFxQnt7QAL7BUKkEEABuigDcgYGgkIkg6T4ACoIkGFR0jJE5UsrxULEgWHLMKdLKztQdvr6lmVI9fQOlgexgWBjAUHKmBKgkolA4gmDwSKiEuhSUOciiOsysHFy8UFiIKMCOF1er1ACy+5Dct5oHlIdKQCAZjGYLFZjLZ7E4oBtogQsAB3Ai+N60AAUOSeCFS1DeIT2YEgGFSWKkgmccEGqmqXjqDSaNFoAEpGPRvr8INw3mzUocXphcCdSGduaTeQF6BEcgB6eUAAWA5AAtIsXhqMNglABBMQCYSSMDYMkSKAVXmWgAW2FMehttug5BIegIgmApgEOQEXowCSFqAAdHJsPgiOLyFig8Bg1xTtG8WzgySsSSyWy2ZMypcCNdONcmCTY2KyNGooJUgBGGmpABMUEyzkpbGcIF8HIY9CkbagHezZSAA

💻 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