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.