Template literal types for contextually typed template literal expressions by ahejlsberg · Pull Request #43376 · microsoft/TypeScript (original) (raw)
In #41891 we introduced template literal types for all template literal expressions. That turned out to be too much of a breaking change, and it was reverted in #42588. In this PR we instead introduce template literal types for contextually typed template literal expressions. Specifically, a template literal expression is given a template literal type if it is contextually typed by a string literal or template literal type, or if it is contextually typed by a generic type with a constraint that is assignable to type string
, alleviating the need to use as const
in scenarios where it is obvious a template literal type is desired. This less aggressive approach fixes the originally reported issues and shouldn't cause any backwards compatibility breaks.
Some examples:
function bar(s: string): hello ${string}
{
return hello ${s}
; // Now ok, previously was error
}
declare let s: string; declare function g1(x: T): T; declare function g2(x: T): T;
let x1 = g1(xyz-${s}
); // string
let x2 = g2(xyz-${s}
); // xyz-${string}
, previously was string
Fixes #43143.