Skip to content

Commit cce4bfb

Browse files
Revert changes for template literal types, keeping tests. (#42588)
* Revert changes for template literal types, keeping tests. * Update Baselines and/or Applied Lint Fixes Co-authored-by: TypeScript Bot <typescriptbot@microsoft.com>
1 parent 6549754 commit cce4bfb

File tree

205 files changed

+1217
-1159
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

205 files changed

+1217
-1159
lines changed

src/compiler/checker.ts

+28-35
Original file line numberDiff line numberDiff line change
@@ -13371,7 +13371,7 @@ namespace ts {
1337113371
i--;
1337213372
const t = types[i];
1337313373
const remove =
13374-
t.flags & TypeFlags.StringLikeLiteral && includes & TypeFlags.String ||
13374+
t.flags & TypeFlags.StringLiteral && includes & TypeFlags.String ||
1337513375
t.flags & TypeFlags.NumberLiteral && includes & TypeFlags.Number ||
1337613376
t.flags & TypeFlags.BigIntLiteral && includes & TypeFlags.BigInt ||
1337713377
t.flags & TypeFlags.UniqueESSymbol && includes & TypeFlags.ESSymbol ||
@@ -13442,7 +13442,7 @@ namespace ts {
1344213442
}
1344313443
switch (unionReduction) {
1344413444
case UnionReduction.Literal:
13445-
if (includes & (TypeFlags.FreshableLiteral | TypeFlags.UniqueESSymbol)) {
13445+
if (includes & (TypeFlags.Literal | TypeFlags.UniqueESSymbol)) {
1344613446
removeRedundantLiteralTypes(typeSet, includes);
1344713447
}
1344813448
if (includes & TypeFlags.StringLiteral && includes & TypeFlags.TemplateLiteral) {
@@ -14041,7 +14041,6 @@ namespace ts {
1404114041
let type = templateLiteralTypes.get(id);
1404214042
if (!type) {
1404314043
templateLiteralTypes.set(id, type = createTemplateLiteralType(newTexts, newTypes));
14044-
type.regularType = type;
1404514044
}
1404614045
return type;
1404714046

@@ -15098,28 +15097,26 @@ namespace ts {
1509815097
}
1509915098

1510015099
function getFreshTypeOfLiteralType(type: Type): Type {
15101-
if (type.flags & TypeFlags.FreshableLiteral) {
15102-
if (!(<FreshableLiteralType>type).freshType) {
15103-
const freshType = type.flags & TypeFlags.TemplateLiteral ?
15104-
createTemplateLiteralType((<TemplateLiteralType>type).texts, (<TemplateLiteralType>type).types) :
15105-
createLiteralType(type.flags, (<LiteralType>type).value, (<LiteralType>type).symbol);
15106-
freshType.regularType = <FreshableLiteralType>type;
15100+
if (type.flags & TypeFlags.Literal) {
15101+
if (!(<LiteralType>type).freshType) {
15102+
const freshType = createLiteralType(type.flags, (<LiteralType>type).value, (<LiteralType>type).symbol);
15103+
freshType.regularType = <LiteralType>type;
1510715104
freshType.freshType = freshType;
15108-
(<FreshableLiteralType>type).freshType = freshType;
15105+
(<LiteralType>type).freshType = freshType;
1510915106
}
15110-
return (<FreshableLiteralType>type).freshType;
15107+
return (<LiteralType>type).freshType;
1511115108
}
1511215109
return type;
1511315110
}
1511415111

1511515112
function getRegularTypeOfLiteralType(type: Type): Type {
15116-
return type.flags & TypeFlags.FreshableLiteral ? (<FreshableLiteralType>type).regularType :
15113+
return type.flags & TypeFlags.Literal ? (<LiteralType>type).regularType :
1511715114
type.flags & TypeFlags.Union ? ((<UnionType>type).regularType || ((<UnionType>type).regularType = mapType(type, getRegularTypeOfLiteralType) as UnionType)) :
1511815115
type;
1511915116
}
1512015117

1512115118
function isFreshLiteralType(type: Type) {
15122-
return !!(type.flags & TypeFlags.FreshableLiteral) && (<FreshableLiteralType>type).freshType === type;
15119+
return !!(type.flags & TypeFlags.Literal) && (<LiteralType>type).freshType === type;
1512315120
}
1512415121

1512515122
function getLiteralType(value: string): StringLiteralType;
@@ -18030,20 +18027,17 @@ namespace ts {
1803018027
}
1803118028
}
1803218029
else if (source.flags & TypeFlags.TemplateLiteral) {
18033-
if (target.flags & TypeFlags.TemplateLiteral) {
18034-
if ((source as TemplateLiteralType).texts.length === (target as TemplateLiteralType).texts.length &&
18035-
(source as TemplateLiteralType).types.length === (target as TemplateLiteralType).types.length &&
18036-
every((source as TemplateLiteralType).texts, (t, i) => t === (target as TemplateLiteralType).texts[i]) &&
18037-
every((instantiateType(source, makeFunctionTypeMapper(reportUnreliableMarkers)) as TemplateLiteralType).types, (t, i) => !!((target as TemplateLiteralType).types[i].flags & (TypeFlags.Any | TypeFlags.String)) || !!isRelatedTo(t, (target as TemplateLiteralType).types[i], /*reportErrors*/ false))) {
18038-
return Ternary.True;
18039-
}
18030+
if (target.flags & TypeFlags.TemplateLiteral &&
18031+
(source as TemplateLiteralType).texts.length === (target as TemplateLiteralType).texts.length &&
18032+
(source as TemplateLiteralType).types.length === (target as TemplateLiteralType).types.length &&
18033+
every((source as TemplateLiteralType).texts, (t, i) => t === (target as TemplateLiteralType).texts[i]) &&
18034+
every((instantiateType(source, makeFunctionTypeMapper(reportUnreliableMarkers)) as TemplateLiteralType).types, (t, i) => !!((target as TemplateLiteralType).types[i].flags & (TypeFlags.Any | TypeFlags.String)) || !!isRelatedTo(t, (target as TemplateLiteralType).types[i], /*reportErrors*/ false))) {
18035+
return Ternary.True;
1804018036
}
18041-
else {
18042-
const constraint = getBaseConstraintOfType(source);
18043-
if (result = isRelatedTo(constraint && constraint !== source ? constraint : stringType, target, reportErrors)) {
18044-
resetErrorInfo(saveErrorInfo);
18045-
return result;
18046-
}
18037+
const constraint = getBaseConstraintOfType(source);
18038+
if (constraint && constraint !== source && (result = isRelatedTo(constraint, target, reportErrors))) {
18039+
resetErrorInfo(saveErrorInfo);
18040+
return result;
1804718041
}
1804818042
}
1804918043
else if (source.flags & TypeFlags.StringMapping) {
@@ -19538,7 +19532,7 @@ namespace ts {
1953819532

1953919533
function getBaseTypeOfLiteralType(type: Type): Type {
1954019534
return type.flags & TypeFlags.EnumLiteral ? getBaseTypeOfEnumLiteralType(<LiteralType>type) :
19541-
type.flags & TypeFlags.StringLikeLiteral ? stringType :
19535+
type.flags & TypeFlags.StringLiteral ? stringType :
1954219536
type.flags & TypeFlags.NumberLiteral ? numberType :
1954319537
type.flags & TypeFlags.BigIntLiteral ? bigintType :
1954419538
type.flags & TypeFlags.BooleanLiteral ? booleanType :
@@ -19548,7 +19542,7 @@ namespace ts {
1954819542

1954919543
function getWidenedLiteralType(type: Type): Type {
1955019544
return type.flags & TypeFlags.EnumLiteral && isFreshLiteralType(type) ? getBaseTypeOfEnumLiteralType(<LiteralType>type) :
19551-
type.flags & TypeFlags.StringLikeLiteral && isFreshLiteralType(type) ? stringType :
19545+
type.flags & TypeFlags.StringLiteral && isFreshLiteralType(type) ? stringType :
1955219546
type.flags & TypeFlags.NumberLiteral && isFreshLiteralType(type) ? numberType :
1955319547
type.flags & TypeFlags.BigIntLiteral && isFreshLiteralType(type) ? bigintType :
1955419548
type.flags & TypeFlags.BooleanLiteral && isFreshLiteralType(type) ? booleanType :
@@ -21042,7 +21036,7 @@ namespace ts {
2104221036
}
2104321037

2104421038
function isTypeOrBaseIdenticalTo(s: Type, t: Type) {
21045-
return isTypeIdenticalTo(s, t) || !!(t.flags & TypeFlags.String && s.flags & TypeFlags.StringLikeLiteral || t.flags & TypeFlags.Number && s.flags & TypeFlags.NumberLiteral);
21039+
return isTypeIdenticalTo(s, t) || !!(t.flags & TypeFlags.String && s.flags & TypeFlags.StringLiteral || t.flags & TypeFlags.Number && s.flags & TypeFlags.NumberLiteral);
2104621040
}
2104721041

2104821042
function isTypeCloselyMatchedBy(s: Type, t: Type) {
@@ -31300,7 +31294,7 @@ namespace ts {
3130031294
texts.push(span.literal.text);
3130131295
types.push(isTypeAssignableTo(type, templateConstraintType) ? type : stringType);
3130231296
}
31303-
return getFreshTypeOfLiteralType(getTemplateLiteralType(texts, types));
31297+
return isConstContext(node) ? getTemplateLiteralType(texts, types) : stringType;
3130431298
}
3130531299

3130631300
function getContextNode(node: Expression): Node {
@@ -31321,7 +31315,7 @@ namespace ts {
3132131315
// We strip literal freshness when an appropriate contextual type is present such that contextually typed
3132231316
// literals always preserve their literal types (otherwise they might widen during type inference). An alternative
3132331317
// here would be to not mark contextually typed literals as fresh in the first place.
31324-
const result = maybeTypeOfKind(type, TypeFlags.FreshableLiteral) && isLiteralOfContextualType(type, instantiateContextualType(contextualType, node)) ?
31318+
const result = maybeTypeOfKind(type, TypeFlags.Literal) && isLiteralOfContextualType(type, instantiateContextualType(contextualType, node)) ?
3132531319
getRegularTypeOfLiteralType(type) : type;
3132631320
return result;
3132731321
}
@@ -31411,15 +31405,15 @@ namespace ts {
3141131405
// this a literal context for literals of that primitive type. For example, given a
3141231406
// type parameter 'T extends string', infer string literal types for T.
3141331407
const constraint = getBaseConstraintOfType(contextualType) || unknownType;
31414-
return maybeTypeOfKind(constraint, TypeFlags.String) && maybeTypeOfKind(candidateType, TypeFlags.StringLikeLiteral) ||
31408+
return maybeTypeOfKind(constraint, TypeFlags.String) && maybeTypeOfKind(candidateType, TypeFlags.StringLiteral) ||
3141531409
maybeTypeOfKind(constraint, TypeFlags.Number) && maybeTypeOfKind(candidateType, TypeFlags.NumberLiteral) ||
3141631410
maybeTypeOfKind(constraint, TypeFlags.BigInt) && maybeTypeOfKind(candidateType, TypeFlags.BigIntLiteral) ||
3141731411
maybeTypeOfKind(constraint, TypeFlags.ESSymbol) && maybeTypeOfKind(candidateType, TypeFlags.UniqueESSymbol) ||
3141831412
isLiteralOfContextualType(candidateType, constraint);
3141931413
}
3142031414
// If the contextual type is a literal of a particular primitive type, we consider this a
3142131415
// literal context for all literals of that primitive type.
31422-
return !!(contextualType.flags & (TypeFlags.StringLikeLiteral | TypeFlags.Index | TypeFlags.StringMapping) && maybeTypeOfKind(candidateType, TypeFlags.StringLikeLiteral) ||
31416+
return !!(contextualType.flags & (TypeFlags.StringLiteral | TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) && maybeTypeOfKind(candidateType, TypeFlags.StringLiteral) ||
3142331417
contextualType.flags & TypeFlags.NumberLiteral && maybeTypeOfKind(candidateType, TypeFlags.NumberLiteral) ||
3142431418
contextualType.flags & TypeFlags.BigIntLiteral && maybeTypeOfKind(candidateType, TypeFlags.BigIntLiteral) ||
3142531419
contextualType.flags & TypeFlags.BooleanLiteral && maybeTypeOfKind(candidateType, TypeFlags.BooleanLiteral) ||
@@ -38963,8 +38957,7 @@ namespace ts {
3896338957

3896438958
function isLiteralConstDeclaration(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): boolean {
3896538959
if (isDeclarationReadonly(node) || isVariableDeclaration(node) && isVarConst(node)) {
38966-
const type = getTypeOfSymbol(getSymbolOfNode(node));
38967-
return !!(type.flags & TypeFlags.Literal) && isFreshLiteralType(type);
38960+
return isFreshLiteralType(getTypeOfSymbol(getSymbolOfNode(node)));
3896838961
}
3896938962
return false;
3897038963
}

src/compiler/types.ts

+1-9
Original file line numberDiff line numberDiff line change
@@ -4972,10 +4972,6 @@ namespace ts {
49724972
Unit = Literal | UniqueESSymbol | Nullable,
49734973
StringOrNumberLiteral = StringLiteral | NumberLiteral,
49744974
/* @internal */
4975-
StringLikeLiteral = StringLiteral | TemplateLiteral,
4976-
/* @internal */
4977-
FreshableLiteral = Literal | TemplateLiteral,
4978-
/* @internal */
49794975
StringOrNumberLiteralOrUnique = StringLiteral | NumberLiteral | UniqueESSymbol,
49804976
/* @internal */
49814977
DefinitelyFalsy = StringLiteral | NumberLiteral | BigIntLiteral | BooleanLiteral | Void | Undefined | Null,
@@ -5069,9 +5065,7 @@ namespace ts {
50695065
}
50705066

50715067
/* @internal */
5072-
export type FreshableLiteralType = LiteralType | TemplateLiteralType;
5073-
/* @internal */
5074-
export type FreshableType = FreshableLiteralType | FreshableIntrinsicType;
5068+
export type FreshableType = LiteralType | FreshableIntrinsicType;
50755069

50765070
// String literal types (TypeFlags.StringLiteral)
50775071
// Numeric literal types (TypeFlags.NumberLiteral)
@@ -5475,8 +5469,6 @@ namespace ts {
54755469
export interface TemplateLiteralType extends InstantiableType {
54765470
texts: readonly string[]; // Always one element longer than types
54775471
types: readonly Type[]; // Always at least one element
5478-
freshType: TemplateLiteralType; // Fresh version of type
5479-
regularType: TemplateLiteralType; // Regular version of type
54805472
}
54815473

54825474
export interface StringMappingType extends InstantiableType {
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
=== tests/cases/conformance/es6/templates/TemplateExpression1.ts ===
22
var v = `foo ${ a
33
>v : string
4-
>`foo ${ a : `foo ${any}`
4+
>`foo ${ a : string
55
>a : any
66

tests/baselines/reference/accessorsOverrideProperty2.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Derived extends Base {
2222
>console.log : (...data: any[]) => void
2323
>console : Console
2424
>log : (...data: any[]) => void
25-
>`x was set to ${value}` : `x was set to ${number}`
25+
>`x was set to ${value}` : string
2626
>value : number
2727
}
2828

tests/baselines/reference/api/tsserverlibrary.d.ts

-2
Original file line numberDiff line numberDiff line change
@@ -2656,8 +2656,6 @@ declare namespace ts {
26562656
export interface TemplateLiteralType extends InstantiableType {
26572657
texts: readonly string[];
26582658
types: readonly Type[];
2659-
freshType: TemplateLiteralType;
2660-
regularType: TemplateLiteralType;
26612659
}
26622660
export interface StringMappingType extends InstantiableType {
26632661
symbol: Symbol;

tests/baselines/reference/api/typescript.d.ts

-2
Original file line numberDiff line numberDiff line change
@@ -2656,8 +2656,6 @@ declare namespace ts {
26562656
export interface TemplateLiteralType extends InstantiableType {
26572657
texts: readonly string[];
26582658
types: readonly Type[];
2659-
freshType: TemplateLiteralType;
2660-
regularType: TemplateLiteralType;
26612659
}
26622660
export interface StringMappingType extends InstantiableType {
26632661
symbol: Symbol;

tests/baselines/reference/asOperator3.types

+6-6
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@ declare function tag(...x: any[]): any;
55

66
var a = `${123 + 456 as number}`;
77
>a : string
8-
>`${123 + 456 as number}` : `${number}`
8+
>`${123 + 456 as number}` : string
99
>123 + 456 as number : number
1010
>123 + 456 : number
1111
>123 : 123
1212
>456 : 456
1313

1414
var b = `leading ${123 + 456 as number}`;
1515
>b : string
16-
>`leading ${123 + 456 as number}` : `leading ${number}`
16+
>`leading ${123 + 456 as number}` : string
1717
>123 + 456 as number : number
1818
>123 + 456 : number
1919
>123 : 123
2020
>456 : 456
2121

2222
var c = `${123 + 456 as number} trailing`;
2323
>c : string
24-
>`${123 + 456 as number} trailing` : `${number} trailing`
24+
>`${123 + 456 as number} trailing` : string
2525
>123 + 456 as number : number
2626
>123 + 456 : number
2727
>123 : 123
@@ -30,7 +30,7 @@ var c = `${123 + 456 as number} trailing`;
3030
var d = `Hello ${123} World` as string;
3131
>d : string
3232
>`Hello ${123} World` as string : string
33-
>`Hello ${123} World` : "Hello 123 World"
33+
>`Hello ${123} World` : string
3434
>123 : 123
3535

3636
var e = `Hello` as string;
@@ -43,15 +43,15 @@ var f = 1 + `${1} end of string` as string;
4343
>1 + `${1} end of string` as string : string
4444
>1 + `${1} end of string` : string
4545
>1 : 1
46-
>`${1} end of string` : "1 end of string"
46+
>`${1} end of string` : string
4747
>1 : 1
4848

4949
var g = tag `Hello ${123} World` as string;
5050
>g : string
5151
>tag `Hello ${123} World` as string : string
5252
>tag `Hello ${123} World` : any
5353
>tag : (...x: any[]) => any
54-
>`Hello ${123} World` : "Hello 123 World"
54+
>`Hello ${123} World` : string
5555
>123 : 123
5656

5757
var h = tag `Hello` as string;

tests/baselines/reference/checkJsObjectLiteralIndexSignatures.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ let n = Math.random();
1010

1111
let s = `${n}`;
1212
>s : string
13-
>`${n}` : `${number}`
13+
>`${n}` : string
1414
>n : number
1515

1616
const numericIndex = { [n]: 1 };

tests/baselines/reference/computedPropertyNames10_ES5.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,6 @@ var v = {
6060

6161
[`hello ${a} bye`]() { }
6262
>[`hello ${a} bye`] : () => void
63-
>`hello ${a} bye` : `hello ${any} bye`
63+
>`hello ${a} bye` : string
6464
>a : any
6565
}

tests/baselines/reference/computedPropertyNames10_ES6.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,6 @@ var v = {
6060

6161
[`hello ${a} bye`]() { }
6262
>[`hello ${a} bye`] : () => void
63-
>`hello ${a} bye` : `hello ${any} bye`
63+
>`hello ${a} bye` : string
6464
>a : any
6565
}

tests/baselines/reference/computedPropertyNames11_ES5.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ var v = {
7070

7171
get [`hello ${a} bye`]() { return 0; }
7272
>[`hello ${a} bye`] : number
73-
>`hello ${a} bye` : `hello ${any} bye`
73+
>`hello ${a} bye` : string
7474
>a : any
7575
>0 : 0
7676
}

tests/baselines/reference/computedPropertyNames11_ES6.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ var v = {
7070

7171
get [`hello ${a} bye`]() { return 0; }
7272
>[`hello ${a} bye`] : number
73-
>`hello ${a} bye` : `hello ${any} bye`
73+
>`hello ${a} bye` : string
7474
>a : any
7575
>0 : 0
7676
}

tests/baselines/reference/computedPropertyNames12_ES5.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class C {
6363

6464
static [`hello ${a} bye`] = 0
6565
>[`hello ${a} bye`] : number
66-
>`hello ${a} bye` : `hello ${any} bye`
66+
>`hello ${a} bye` : string
6767
>a : any
6868
>0 : 0
6969
}

tests/baselines/reference/computedPropertyNames12_ES6.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class C {
6363

6464
static [`hello ${a} bye`] = 0
6565
>[`hello ${a} bye`] : number
66-
>`hello ${a} bye` : `hello ${any} bye`
66+
>`hello ${a} bye` : string
6767
>a : any
6868
>0 : 0
6969
}

tests/baselines/reference/computedPropertyNames13_ES5.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,6 @@ class C {
5959

6060
static [`hello ${a} bye`]() { }
6161
>[`hello ${a} bye`] : () => void
62-
>`hello ${a} bye` : `hello ${any} bye`
62+
>`hello ${a} bye` : string
6363
>a : any
6464
}

tests/baselines/reference/computedPropertyNames13_ES6.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,6 @@ class C {
5959

6060
static [`hello ${a} bye`]() { }
6161
>[`hello ${a} bye`] : () => void
62-
>`hello ${a} bye` : `hello ${any} bye`
62+
>`hello ${a} bye` : string
6363
>a : any
6464
}

tests/baselines/reference/computedPropertyNames16_ES5.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class C {
6969

7070
get [`hello ${a} bye`]() { return 0; }
7171
>[`hello ${a} bye`] : number
72-
>`hello ${a} bye` : `hello ${any} bye`
72+
>`hello ${a} bye` : string
7373
>a : any
7474
>0 : 0
7575
}

tests/baselines/reference/computedPropertyNames16_ES6.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class C {
6969

7070
get [`hello ${a} bye`]() { return 0; }
7171
>[`hello ${a} bye`] : number
72-
>`hello ${a} bye` : `hello ${any} bye`
72+
>`hello ${a} bye` : string
7373
>a : any
7474
>0 : 0
7575
}

tests/baselines/reference/computedPropertyNames4_ES5.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ var v = {
7070

7171
[`hello ${a} bye`]: 0
7272
>[`hello ${a} bye`] : number
73-
>`hello ${a} bye` : `hello ${any} bye`
73+
>`hello ${a} bye` : string
7474
>a : any
7575
>0 : 0
7676
}

tests/baselines/reference/computedPropertyNames4_ES6.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ var v = {
7070

7171
[`hello ${a} bye`]: 0
7272
>[`hello ${a} bye`] : number
73-
>`hello ${a} bye` : `hello ${any} bye`
73+
>`hello ${a} bye` : string
7474
>a : any
7575
>0 : 0
7676
}

0 commit comments

Comments
 (0)