Microsoft/TypeScript

`as const` breaks intra expression inference

Open

#62,220 opened on Aug 6, 2025

View on GitHub
ย (0 comments)ย (1 reaction)ย (0 assignees)TypeScriptย (48,455 stars)ย (6,726 forks)batch import
Domain: check: Type InferenceHelp WantedPossible Improvement

Description

๐Ÿ”Ž Search Terms

const context expression assertion inference type parameter

๐Ÿ•— Version & Regression Information

  • This is the behavior in every version I tried

โฏ Playground Link

https://www.typescriptlang.org/play/?ts=6.0.0-dev.20250806#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXwxAGcMAeAFQBp4ARAPgApYBzALngG8AoeeLVAA7IM7GgG4e8ATBzBkYEOyYw2tAJTwAvHXjkJvMHiLIAtovjLV5DdvipTAIxAwJAXzWiJXQ6hLwHMgDWIPiaBMQYDNy8-EIi8ACMAAxJlJLSsvLmljY6LAB0GDgAyhgw-MwMamkGRqbZLLnwBRAhzBgAFmmuzUTwPiRqXgMY8ADuODCBFVrhJFGSscLsyanpMnIKSo1aeSqFJWUVVTX9dWbbKk0tbZ3dQ1xAA

๐Ÿ’ป Code

declare function test<T, D>(arg: {
  input: D;
  produce: (arg: D) => T;
  consume: (arg: T) => number;
}): D;

const broken = test({
  input: 100,
  produce: (arg) => arg.toString(), // 'arg' is of type 'unknown'.(18046)
  consume: (arg) => arg.length,
} as const);

const working = test({
  input: 100,
  produce: (arg) => arg.toString(), // `arg` inferred as `number`
  consume: (arg) => arg.length,
});

๐Ÿ™ Actual behavior

as const is the only difference between those two and its presence breaks assigned parameter type in produce

๐Ÿ™‚ Expected behavior

I think as const should not impact inference this way and both should be inferred just OK. It's just that the broken case should infer 100 instead of number for the D type parameter

Additional information about the issue

No response

Contributor guide

`as const` breaks intra expression inference ยท Microsoft/TypeScript#62220 | Good First Issue