What it does not doconst type parameters are not universal deep-literal preservation.
The modifier has the strongest effect on object, array, and primitive expressions written directly in the call. It does not retroactively narrow a variable that has already been inferred broadly. If a caller writes const arr = ["a", "b", "c"], that variable may already have type string[]. Passing arr to a const generic does not reconstruct the original tuple information that was lost earlier.
declare function capture<const T extends readonly string[]>(value: T): T;
const arr = ["a", "b", "c"];
const result = capture(arr);
// arr was already widened, so T remains string[]
If exact literal information must survive assignment to an intermediate variable, the caller may still need as const, an explicit tuple type, or another declaration that preserves the intended narrow type at the point where the value is created.
The modifier also does not guarantee runtime immutability. A readonly TypeScript type restricts operations visible through that reference, but JavaScript objects are still runtime values. If true runtime immutability is a requirement, the design may need copying, freezing, encapsulation, or application-specific controls in addition to type-level readonly annotations.
Finally, narrower inference is not always better. A library that captures every literal too aggressively can produce types that are difficult to read, slow to evaluate, or unnecessarily rigid. Use const generics when the precise literal values are semantically meaningful to the API, not simply because they make an inferred type look impressive.