You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Returns `true` if the intersection of the template literals and string literals is the empty set, eg `get${string}` & "setX", and should reduce to `never`
13178
+
*/
13179
+
function extractRedundantTemplateLiterals(types: Type[]): boolean {
13180
+
let i = types.length;
13181
+
const literals = filter(types, t => !!(t.flags & TypeFlags.StringLiteral));
13182
+
while (i > 0) {
13183
+
i--;
13184
+
const t = types[i];
13185
+
if (!(t.flags & TypeFlags.TemplateLiteral)) continue;
13186
+
for (const t2 of literals) {
13187
+
if (isTypeSubtypeOf(t2, t)) {
13188
+
// eg, ``get${T}` & "getX"` is just `"getX"`
13189
+
orderedRemoveItemAt(types, i);
13190
+
break;
13191
+
}
13192
+
else if (isPatternLiteralType(t)) {
13193
+
return true;
13194
+
}
13195
+
}
13196
+
}
13197
+
return false;
13198
+
}
13199
+
13176
13200
function extractIrreducible(types: Type[], flag: TypeFlags) {
13177
13201
if (every(types, t => !!(t.flags & TypeFlags.Union) && some((t as UnionType).types, tt => !!(tt.flags & flag)))) {
13178
13202
for (let i = 0; i < types.length; i++) {
@@ -13321,7 +13345,12 @@ namespace ts {
13321
13345
}
13322
13346
}
13323
13347
else {
13324
-
result = createIntersectionType(typeSet, aliasSymbol, aliasTypeArguments);
13348
+
if (includes & TypeFlags.TemplateLiteral && includes & TypeFlags.StringLiteral && extractRedundantTemplateLiterals(typeSet)) {
13349
+
result = neverType;
13350
+
}
13351
+
else {
13352
+
result = createIntersectionType(typeSet, aliasSymbol, aliasTypeArguments);
13353
+
}
13325
13354
}
13326
13355
intersectionTypes.set(id, result);
13327
13356
}
@@ -13484,12 +13513,12 @@ namespace ts {
13484
13513
let text = texts[0];
13485
13514
for (let i = 0; i < types.length; i++) {
13486
13515
const t = types[i];
13487
-
if (t.flags & TypeFlags.Literal) {
13516
+
if (t.flags & (TypeFlags.Literal | TypeFlags.Null | TypeFlags.Undefined)) {
13488
13517
const s = applyTemplateCasing(getTemplateStringForType(t) || "", casings[i]);
13489
13518
text += s;
13490
13519
text += texts[i + 1];
13491
13520
}
13492
-
else if (isGenericIndexType(t) || t === stringType) {
13521
+
else if (isGenericIndexType(t) || templateConstraintType.types.indexOf(t) !== -1) {
0 commit comments