@@ -13371,7 +13371,7 @@ namespace ts {
13371
13371
i--;
13372
13372
const t = types[i];
13373
13373
const remove =
13374
- t.flags & TypeFlags.StringLikeLiteral && includes & TypeFlags.String ||
13374
+ t.flags & TypeFlags.StringLiteral && includes & TypeFlags.String ||
13375
13375
t.flags & TypeFlags.NumberLiteral && includes & TypeFlags.Number ||
13376
13376
t.flags & TypeFlags.BigIntLiteral && includes & TypeFlags.BigInt ||
13377
13377
t.flags & TypeFlags.UniqueESSymbol && includes & TypeFlags.ESSymbol ||
@@ -13442,7 +13442,7 @@ namespace ts {
13442
13442
}
13443
13443
switch (unionReduction) {
13444
13444
case UnionReduction.Literal:
13445
- if (includes & (TypeFlags.FreshableLiteral | TypeFlags.UniqueESSymbol)) {
13445
+ if (includes & (TypeFlags.Literal | TypeFlags.UniqueESSymbol)) {
13446
13446
removeRedundantLiteralTypes(typeSet, includes);
13447
13447
}
13448
13448
if (includes & TypeFlags.StringLiteral && includes & TypeFlags.TemplateLiteral) {
@@ -14041,7 +14041,6 @@ namespace ts {
14041
14041
let type = templateLiteralTypes.get(id);
14042
14042
if (!type) {
14043
14043
templateLiteralTypes.set(id, type = createTemplateLiteralType(newTexts, newTypes));
14044
- type.regularType = type;
14045
14044
}
14046
14045
return type;
14047
14046
@@ -15098,28 +15097,26 @@ namespace ts {
15098
15097
}
15099
15098
15100
15099
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;
15107
15104
freshType.freshType = freshType;
15108
- (<FreshableLiteralType >type).freshType = freshType;
15105
+ (<LiteralType >type).freshType = freshType;
15109
15106
}
15110
- return (<FreshableLiteralType >type).freshType;
15107
+ return (<LiteralType >type).freshType;
15111
15108
}
15112
15109
return type;
15113
15110
}
15114
15111
15115
15112
function getRegularTypeOfLiteralType(type: Type): Type {
15116
- return type.flags & TypeFlags.FreshableLiteral ? (<FreshableLiteralType >type).regularType :
15113
+ return type.flags & TypeFlags.Literal ? (<LiteralType >type).regularType :
15117
15114
type.flags & TypeFlags.Union ? ((<UnionType>type).regularType || ((<UnionType>type).regularType = mapType(type, getRegularTypeOfLiteralType) as UnionType)) :
15118
15115
type;
15119
15116
}
15120
15117
15121
15118
function isFreshLiteralType(type: Type) {
15122
- return !!(type.flags & TypeFlags.FreshableLiteral ) && (<FreshableLiteralType >type).freshType === type;
15119
+ return !!(type.flags & TypeFlags.Literal ) && (<LiteralType >type).freshType === type;
15123
15120
}
15124
15121
15125
15122
function getLiteralType(value: string): StringLiteralType;
@@ -18030,20 +18027,17 @@ namespace ts {
18030
18027
}
18031
18028
}
18032
18029
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;
18040
18036
}
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;
18047
18041
}
18048
18042
}
18049
18043
else if (source.flags & TypeFlags.StringMapping) {
@@ -19538,7 +19532,7 @@ namespace ts {
19538
19532
19539
19533
function getBaseTypeOfLiteralType(type: Type): Type {
19540
19534
return type.flags & TypeFlags.EnumLiteral ? getBaseTypeOfEnumLiteralType(<LiteralType>type) :
19541
- type.flags & TypeFlags.StringLikeLiteral ? stringType :
19535
+ type.flags & TypeFlags.StringLiteral ? stringType :
19542
19536
type.flags & TypeFlags.NumberLiteral ? numberType :
19543
19537
type.flags & TypeFlags.BigIntLiteral ? bigintType :
19544
19538
type.flags & TypeFlags.BooleanLiteral ? booleanType :
@@ -19548,7 +19542,7 @@ namespace ts {
19548
19542
19549
19543
function getWidenedLiteralType(type: Type): Type {
19550
19544
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 :
19552
19546
type.flags & TypeFlags.NumberLiteral && isFreshLiteralType(type) ? numberType :
19553
19547
type.flags & TypeFlags.BigIntLiteral && isFreshLiteralType(type) ? bigintType :
19554
19548
type.flags & TypeFlags.BooleanLiteral && isFreshLiteralType(type) ? booleanType :
@@ -21042,7 +21036,7 @@ namespace ts {
21042
21036
}
21043
21037
21044
21038
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);
21046
21040
}
21047
21041
21048
21042
function isTypeCloselyMatchedBy(s: Type, t: Type) {
@@ -31300,7 +31294,7 @@ namespace ts {
31300
31294
texts.push(span.literal.text);
31301
31295
types.push(isTypeAssignableTo(type, templateConstraintType) ? type : stringType);
31302
31296
}
31303
- return getFreshTypeOfLiteralType( getTemplateLiteralType(texts, types)) ;
31297
+ return isConstContext(node) ? getTemplateLiteralType(texts, types) : stringType ;
31304
31298
}
31305
31299
31306
31300
function getContextNode(node: Expression): Node {
@@ -31321,7 +31315,7 @@ namespace ts {
31321
31315
// We strip literal freshness when an appropriate contextual type is present such that contextually typed
31322
31316
// literals always preserve their literal types (otherwise they might widen during type inference). An alternative
31323
31317
// 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)) ?
31325
31319
getRegularTypeOfLiteralType(type) : type;
31326
31320
return result;
31327
31321
}
@@ -31411,15 +31405,15 @@ namespace ts {
31411
31405
// this a literal context for literals of that primitive type. For example, given a
31412
31406
// type parameter 'T extends string', infer string literal types for T.
31413
31407
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 ) ||
31415
31409
maybeTypeOfKind(constraint, TypeFlags.Number) && maybeTypeOfKind(candidateType, TypeFlags.NumberLiteral) ||
31416
31410
maybeTypeOfKind(constraint, TypeFlags.BigInt) && maybeTypeOfKind(candidateType, TypeFlags.BigIntLiteral) ||
31417
31411
maybeTypeOfKind(constraint, TypeFlags.ESSymbol) && maybeTypeOfKind(candidateType, TypeFlags.UniqueESSymbol) ||
31418
31412
isLiteralOfContextualType(candidateType, constraint);
31419
31413
}
31420
31414
// If the contextual type is a literal of a particular primitive type, we consider this a
31421
31415
// 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 ) ||
31423
31417
contextualType.flags & TypeFlags.NumberLiteral && maybeTypeOfKind(candidateType, TypeFlags.NumberLiteral) ||
31424
31418
contextualType.flags & TypeFlags.BigIntLiteral && maybeTypeOfKind(candidateType, TypeFlags.BigIntLiteral) ||
31425
31419
contextualType.flags & TypeFlags.BooleanLiteral && maybeTypeOfKind(candidateType, TypeFlags.BooleanLiteral) ||
@@ -38963,8 +38957,7 @@ namespace ts {
38963
38957
38964
38958
function isLiteralConstDeclaration(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): boolean {
38965
38959
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)));
38968
38961
}
38969
38962
return false;
38970
38963
}
0 commit comments