Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Template literal types for contextually typed template literal expressions #43376

Merged
merged 4 commits into from
Mar 26, 2021

Conversation

ahejlsberg
Copy link
Member

@ahejlsberg ahejlsberg commented Mar 25, 2021

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-bot typescript-bot added Author: Team For Milestone Bug PRs that fix a bug with a specific milestone labels Mar 25, 2021
@ahejlsberg ahejlsberg added this to the TypeScript 4.3.1 milestone Mar 25, 2021
@orta
Copy link
Contributor

orta commented Mar 26, 2021

@typescript-bot pack this

@typescript-bot
Copy link
Collaborator

typescript-bot commented Mar 26, 2021

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Author: Team For Milestone Bug PRs that fix a bug with a specific milestone
Projects
None yet
Development

Successfully merging this pull request may close these issues.

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