Conversation

ahejlsberg

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<T>(x: T): T;
declare function g2<T extends string>(x: T): T;

let x1 = g1(`xyz-${s}`);  // string
let x2 = g2(`xyz-${s}`);  // `xyz-${string}`, previously was string

Fixes #43143.

@typescript-bottypescript-bot added Author: Team For Milestone BugPRs that fix a bug with a specific milestonelabels Mar 25, 2021
@ahejlsbergahejlsberg added this to the TypeScript 4.3.1 milestone Mar 25, 2021
@orta

@typescript-bot pack this

@typescript-bot

Heya @orta, I've started to run the tarball bundle task on this PR at a155082. You can monitor the build here.

@ghost ghost mentioned this pull request Jun 6, 2021
Sign up for free to join this conversation on . Already have an account? Sign in to comment
Author: Team For Milestone BugPRs that fix a bug with a specific milestone
None yet

Successfully merging this pull request may close these issues.

Cannot define a matching template literal type to a defined template literal