@@ -263,20 +263,6 @@ namespace ts {
263263 VoidIsNonOptional = 1 << 1,
264264 }
265265
266- const enum TemplateTypePlaceholderPriority {
267- Never, // lowest
268- KeywordLiterals, // true | false | null | undefined
269- Boolean,
270- BigIntLiterals,
271- BigInt,
272- NumberLiterals,
273- Enums,
274- Number,
275- StringLiterals,
276- TemplateLiterals,
277- String, // highest
278- }
279-
280266 const enum IntrinsicTypeKind {
281267 Uppercase,
282268 Lowercase,
@@ -22743,23 +22729,6 @@ namespace ts {
2274322729 }
2274422730 }
2274522731
22746- function getTemplateTypePlaceholderPriority(type: Type) {
22747- return type.flags & TypeFlags.String ? TemplateTypePlaceholderPriority.String :
22748- type.flags & TypeFlags.TemplateLiteral ? TemplateTypePlaceholderPriority.TemplateLiterals :
22749- type.flags & TypeFlags.StringMapping ? TemplateTypePlaceholderPriority.StringLiterals :
22750- type.flags & TypeFlags.StringLiteral ? TemplateTypePlaceholderPriority.StringLiterals :
22751- type.flags & TypeFlags.Number ? TemplateTypePlaceholderPriority.Number :
22752- type.flags & TypeFlags.Enum ? TemplateTypePlaceholderPriority.Enums :
22753- type.flags & TypeFlags.NumberLiteral ? TemplateTypePlaceholderPriority.NumberLiterals :
22754- type.flags & TypeFlags.BigInt ? TemplateTypePlaceholderPriority.BigInt :
22755- type.flags & TypeFlags.BigIntLiteral ? TemplateTypePlaceholderPriority.BigIntLiterals :
22756- type.flags & TypeFlags.Boolean ? TemplateTypePlaceholderPriority.Boolean :
22757- type.flags & TypeFlags.BooleanLiteral ? TemplateTypePlaceholderPriority.KeywordLiterals :
22758- type.flags & TypeFlags.Undefined ? TemplateTypePlaceholderPriority.KeywordLiterals :
22759- type.flags & TypeFlags.Null ? TemplateTypePlaceholderPriority.KeywordLiterals :
22760- TemplateTypePlaceholderPriority.Never;
22761- }
22762-
2276322732 function inferToTemplateLiteralType(source: Type, target: TemplateLiteralType) {
2276422733 const matches = inferTypesFromTemplateLiteralType(source, target);
2276522734 const types = target.types;
@@ -22797,19 +22766,22 @@ namespace ts {
2279722766 }
2279822767
2279922768 // for each type in the constraint, find the highest priority matching type
22800- const matchingType = reduceType(constraint, (matchingType, t) =>
22801- !(t.flags & allTypeFlags) || getTemplateTypePlaceholderPriority(t) <= getTemplateTypePlaceholderPriority(matchingType) ? matchingType :
22802- t.flags & TypeFlags.String ? source :
22803- t.flags & TypeFlags.TemplateLiteral && isTypeMatchedByTemplateLiteralType(source, t as TemplateLiteralType) ? source :
22804- t.flags & TypeFlags.StringMapping && str === applyStringMapping(t.symbol, str) ? source :
22805- t.flags & (TypeFlags.Number | TypeFlags.Enum) ? getNumberLiteralType(+str) : // if `str` was not a valid number, TypeFlags.Number and TypeFlags.Enum would have been excluded above.
22806- t.flags & TypeFlags.BigInt ? parseBigIntLiteralType(str) : // if `str` was not a valid bigint, TypeFlags.BigInt would have been excluded above.
22807- t.flags & TypeFlags.Boolean ? str === "true" ? trueType : falseType :
22808- t.flags & TypeFlags.StringLiteral && (t as StringLiteralType).value === str ? t :
22809- t.flags & TypeFlags.NumberLiteral && (t as NumberLiteralType).value === +str ? t :
22810- t.flags & TypeFlags.BigIntLiteral && pseudoBigIntToString((t as BigIntLiteralType).value) === str ? t :
22811- t.flags & (TypeFlags.BooleanLiteral | TypeFlags.Nullable) && (t as IntrinsicType).intrinsicName === str ? t :
22812- matchingType,
22769+ const matchingType = reduceType(constraint, (left, right) =>
22770+ !(right.flags & allTypeFlags) ? left :
22771+ left.flags & TypeFlags.String ? left : right.flags & TypeFlags.String ? source :
22772+ left.flags & TypeFlags.TemplateLiteral ? left : right.flags & TypeFlags.TemplateLiteral && isTypeMatchedByTemplateLiteralType(source, right as TemplateLiteralType) ? source :
22773+ left.flags & TypeFlags.StringMapping ? left : right.flags & TypeFlags.StringMapping && str === applyStringMapping(right.symbol, str) ? source :
22774+ left.flags & TypeFlags.StringLiteral ? left : right.flags & TypeFlags.StringLiteral && (right as StringLiteralType).value === str ? right :
22775+ left.flags & TypeFlags.Number ? left : right.flags & TypeFlags.Number ? getNumberLiteralType(+str) :
22776+ left.flags & TypeFlags.Enum ? left : right.flags & TypeFlags.Enum ? getNumberLiteralType(+str) :
22777+ left.flags & TypeFlags.NumberLiteral ? left : right.flags & TypeFlags.NumberLiteral && (right as NumberLiteralType).value === +str ? right :
22778+ left.flags & TypeFlags.BigInt ? left : right.flags & TypeFlags.BigInt ? parseBigIntLiteralType(str) :
22779+ left.flags & TypeFlags.BigIntLiteral ? left : right.flags & TypeFlags.BigIntLiteral && pseudoBigIntToString((right as BigIntLiteralType).value) === str ? right :
22780+ left.flags & TypeFlags.Boolean ? left : right.flags & TypeFlags.Boolean ? str === "true" ? trueType : falseType :
22781+ left.flags & TypeFlags.BooleanLiteral ? left : right.flags & TypeFlags.BooleanLiteral && (right as IntrinsicType).intrinsicName === str ? right :
22782+ left.flags & TypeFlags.Undefined ? left : right.flags & TypeFlags.Undefined && (right as IntrinsicType).intrinsicName === str ? right :
22783+ left.flags & TypeFlags.Null ? left : right.flags & TypeFlags.Null && (right as IntrinsicType).intrinsicName === str ? right :
22784+ left,
2281322785 neverType as Type);
2281422786
2281522787 if (!(matchingType.flags & TypeFlags.Never)) {
0 commit comments