@@ -13187,7 +13187,7 @@ namespace ts {
1318713187 i--;
1318813188 const t = types[i];
1318913189 const remove =
13190- t.flags & TypeFlags.StringLiteral && includes & TypeFlags.String ||
13190+ t.flags & TypeFlags.StringLikeLiteral && includes & TypeFlags.String ||
1319113191 t.flags & TypeFlags.NumberLiteral && includes & TypeFlags.Number ||
1319213192 t.flags & TypeFlags.BigIntLiteral && includes & TypeFlags.BigInt ||
1319313193 t.flags & TypeFlags.UniqueESSymbol && includes & TypeFlags.ESSymbol ||
@@ -13234,7 +13234,7 @@ namespace ts {
1323413234 }
1323513235 switch (unionReduction) {
1323613236 case UnionReduction.Literal:
13237- if (includes & (TypeFlags.Literal | TypeFlags.UniqueESSymbol)) {
13237+ if (includes & (TypeFlags.FreshableLiteral | TypeFlags.UniqueESSymbol)) {
1323813238 removeRedundantLiteralTypes(typeSet, includes);
1323913239 }
1324013240 if (includes & TypeFlags.StringLiteral && includes & TypeFlags.TemplateLiteral) {
@@ -13765,6 +13765,7 @@ namespace ts {
1376513765 let type = templateLiteralTypes.get(id);
1376613766 if (!type) {
1376713767 templateLiteralTypes.set(id, type = createTemplateLiteralType(newTexts, newTypes));
13768+ type.regularType = type;
1376813769 }
1376913770 return type;
1377013771
@@ -14803,26 +14804,28 @@ namespace ts {
1480314804 }
1480414805
1480514806 function getFreshTypeOfLiteralType(type: Type): Type {
14806- if (type.flags & TypeFlags.Literal) {
14807- if (!(<LiteralType>type).freshType) {
14808- const freshType = createLiteralType(type.flags, (<LiteralType>type).value, (<LiteralType>type).symbol);
14809- freshType.regularType = <LiteralType>type;
14807+ if (type.flags & TypeFlags.FreshableLiteral) {
14808+ if (!(<FreshableLiteralType>type).freshType) {
14809+ const freshType = type.flags & TypeFlags.TemplateLiteral ?
14810+ createTemplateLiteralType((<TemplateLiteralType>type).texts, (<TemplateLiteralType>type).types) :
14811+ createLiteralType(type.flags, (<LiteralType>type).value, (<LiteralType>type).symbol);
14812+ freshType.regularType = <FreshableLiteralType>type;
1481014813 freshType.freshType = freshType;
14811- (<LiteralType >type).freshType = freshType;
14814+ (<FreshableLiteralType >type).freshType = freshType;
1481214815 }
14813- return (<LiteralType >type).freshType;
14816+ return (<FreshableLiteralType >type).freshType;
1481414817 }
1481514818 return type;
1481614819 }
1481714820
1481814821 function getRegularTypeOfLiteralType(type: Type): Type {
14819- return type.flags & TypeFlags.Literal ? (<LiteralType >type).regularType :
14822+ return type.flags & TypeFlags.FreshableLiteral ? (<FreshableLiteralType >type).regularType :
1482014823 type.flags & TypeFlags.Union ? ((<UnionType>type).regularType || ((<UnionType>type).regularType = getUnionType(sameMap((<UnionType>type).types, getRegularTypeOfLiteralType)) as UnionType)) :
1482114824 type;
1482214825 }
1482314826
1482414827 function isFreshLiteralType(type: Type) {
14825- return !!(type.flags & TypeFlags.Literal ) && (<LiteralType >type).freshType === type;
14828+ return !!(type.flags & TypeFlags.FreshableLiteral ) && (<FreshableLiteralType >type).freshType === type;
1482614829 }
1482714830
1482814831 function getLiteralType(value: string): StringLiteralType;
@@ -17694,17 +17697,20 @@ namespace ts {
1769417697 }
1769517698 }
1769617699 else if (source.flags & TypeFlags.TemplateLiteral) {
17697- if (target.flags & TypeFlags.TemplateLiteral &&
17698- (source as TemplateLiteralType).texts.length === (target as TemplateLiteralType).texts.length &&
17699- (source as TemplateLiteralType).types.length === (target as TemplateLiteralType).types.length &&
17700- every((source as TemplateLiteralType).texts, (t, i) => t === (target as TemplateLiteralType).texts[i]) &&
17701- 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))) {
17702- return Ternary.True;
17700+ if (target.flags & TypeFlags.TemplateLiteral) {
17701+ if ((source as TemplateLiteralType).texts.length === (target as TemplateLiteralType).texts.length &&
17702+ (source as TemplateLiteralType).types.length === (target as TemplateLiteralType).types.length &&
17703+ every((source as TemplateLiteralType).texts, (t, i) => t === (target as TemplateLiteralType).texts[i]) &&
17704+ 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))) {
17705+ return Ternary.True;
17706+ }
1770317707 }
17704- const constraint = getBaseConstraintOfType(source);
17705- if (constraint && constraint !== source && (result = isRelatedTo(constraint, target, reportErrors))) {
17706- resetErrorInfo(saveErrorInfo);
17707- return result;
17708+ else {
17709+ const constraint = getBaseConstraintOfType(source);
17710+ if (result = isRelatedTo(constraint && constraint !== source ? constraint : stringType, target, reportErrors)) {
17711+ resetErrorInfo(saveErrorInfo);
17712+ return result;
17713+ }
1770817714 }
1770917715 }
1771017716 else if (source.flags & TypeFlags.StringMapping) {
@@ -19181,7 +19187,7 @@ namespace ts {
1918119187
1918219188 function getBaseTypeOfLiteralType(type: Type): Type {
1918319189 return type.flags & TypeFlags.EnumLiteral ? getBaseTypeOfEnumLiteralType(<LiteralType>type) :
19184- type.flags & TypeFlags.StringLiteral ? stringType :
19190+ type.flags & TypeFlags.StringLikeLiteral ? stringType :
1918519191 type.flags & TypeFlags.NumberLiteral ? numberType :
1918619192 type.flags & TypeFlags.BigIntLiteral ? bigintType :
1918719193 type.flags & TypeFlags.BooleanLiteral ? booleanType :
@@ -19191,7 +19197,7 @@ namespace ts {
1919119197
1919219198 function getWidenedLiteralType(type: Type): Type {
1919319199 return type.flags & TypeFlags.EnumLiteral && isFreshLiteralType(type) ? getBaseTypeOfEnumLiteralType(<LiteralType>type) :
19194- type.flags & TypeFlags.StringLiteral && isFreshLiteralType(type) ? stringType :
19200+ type.flags & TypeFlags.StringLikeLiteral && isFreshLiteralType(type) ? stringType :
1919519201 type.flags & TypeFlags.NumberLiteral && isFreshLiteralType(type) ? numberType :
1919619202 type.flags & TypeFlags.BigIntLiteral && isFreshLiteralType(type) ? bigintType :
1919719203 type.flags & TypeFlags.BooleanLiteral && isFreshLiteralType(type) ? booleanType :
@@ -20692,7 +20698,7 @@ namespace ts {
2069220698 }
2069320699
2069420700 function isTypeOrBaseIdenticalTo(s: Type, t: Type) {
20695- return isTypeIdenticalTo(s, t) || !!(t.flags & TypeFlags.String && s.flags & TypeFlags.StringLiteral || t.flags & TypeFlags.Number && s.flags & TypeFlags.NumberLiteral);
20701+ return isTypeIdenticalTo(s, t) || !!(t.flags & TypeFlags.String && s.flags & TypeFlags.StringLikeLiteral || t.flags & TypeFlags.Number && s.flags & TypeFlags.NumberLiteral);
2069620702 }
2069720703
2069820704 function isTypeCloselyMatchedBy(s: Type, t: Type) {
@@ -30837,7 +30843,7 @@ namespace ts {
3083730843 texts.push(span.literal.text);
3083830844 types.push(isTypeAssignableTo(type, templateConstraintType) ? type : stringType);
3083930845 }
30840- return isConstContext(node) ? getTemplateLiteralType(texts, types) : stringType ;
30846+ return getFreshTypeOfLiteralType( getTemplateLiteralType(texts, types)) ;
3084130847 }
3084230848
3084330849 function getContextNode(node: Expression): Node {
@@ -30858,7 +30864,7 @@ namespace ts {
3085830864 // We strip literal freshness when an appropriate contextual type is present such that contextually typed
3085930865 // literals always preserve their literal types (otherwise they might widen during type inference). An alternative
3086030866 // here would be to not mark contextually typed literals as fresh in the first place.
30861- const result = maybeTypeOfKind(type, TypeFlags.Literal ) && isLiteralOfContextualType(type, instantiateContextualType(contextualType, node)) ?
30867+ const result = maybeTypeOfKind(type, TypeFlags.FreshableLiteral ) && isLiteralOfContextualType(type, instantiateContextualType(contextualType, node)) ?
3086230868 getRegularTypeOfLiteralType(type) : type;
3086330869 return result;
3086430870 }
@@ -30948,15 +30954,15 @@ namespace ts {
3094830954 // this a literal context for literals of that primitive type. For example, given a
3094930955 // type parameter 'T extends string', infer string literal types for T.
3095030956 const constraint = getBaseConstraintOfType(contextualType) || unknownType;
30951- return maybeTypeOfKind(constraint, TypeFlags.String) && maybeTypeOfKind(candidateType, TypeFlags.StringLiteral ) ||
30957+ return maybeTypeOfKind(constraint, TypeFlags.String) && maybeTypeOfKind(candidateType, TypeFlags.StringLikeLiteral ) ||
3095230958 maybeTypeOfKind(constraint, TypeFlags.Number) && maybeTypeOfKind(candidateType, TypeFlags.NumberLiteral) ||
3095330959 maybeTypeOfKind(constraint, TypeFlags.BigInt) && maybeTypeOfKind(candidateType, TypeFlags.BigIntLiteral) ||
3095430960 maybeTypeOfKind(constraint, TypeFlags.ESSymbol) && maybeTypeOfKind(candidateType, TypeFlags.UniqueESSymbol) ||
3095530961 isLiteralOfContextualType(candidateType, constraint);
3095630962 }
3095730963 // If the contextual type is a literal of a particular primitive type, we consider this a
3095830964 // literal context for all literals of that primitive type.
30959- return !!(contextualType.flags & (TypeFlags.StringLiteral | TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags. StringMapping) && maybeTypeOfKind(candidateType, TypeFlags.StringLiteral ) ||
30965+ return !!(contextualType.flags & (TypeFlags.StringLikeLiteral | TypeFlags.Index | TypeFlags.StringMapping) && maybeTypeOfKind(candidateType, TypeFlags.StringLikeLiteral ) ||
3096030966 contextualType.flags & TypeFlags.NumberLiteral && maybeTypeOfKind(candidateType, TypeFlags.NumberLiteral) ||
3096130967 contextualType.flags & TypeFlags.BigIntLiteral && maybeTypeOfKind(candidateType, TypeFlags.BigIntLiteral) ||
3096230968 contextualType.flags & TypeFlags.BooleanLiteral && maybeTypeOfKind(candidateType, TypeFlags.BooleanLiteral) ||
@@ -38482,7 +38488,8 @@ namespace ts {
3848238488
3848338489 function isLiteralConstDeclaration(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): boolean {
3848438490 if (isDeclarationReadonly(node) || isVariableDeclaration(node) && isVarConst(node)) {
38485- return isFreshLiteralType(getTypeOfSymbol(getSymbolOfNode(node)));
38491+ const type = getTypeOfSymbol(getSymbolOfNode(node));
38492+ return !!(type.flags & TypeFlags.Literal) && isFreshLiteralType(type);
3848638493 }
3848738494 return false;
3848838495 }
0 commit comments