diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d45fdf65e59..146fd8a95f5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13565,6 +13565,9 @@ namespace ts { mapType(types[unionIndex], t => getTemplateLiteralType(texts, replaceElement(types, unionIndex, t))) : errorType; } + if (contains(types, wildcardType)) { + return wildcardType; + } const newTypes: Type[] = []; const newTexts: string[] = []; let text = texts[0]; diff --git a/tests/baselines/reference/templateLiteralTypes1.errors.txt b/tests/baselines/reference/templateLiteralTypes1.errors.txt index 66c5859bc7e..bce55c2b122 100644 --- a/tests/baselines/reference/templateLiteralTypes1.errors.txt +++ b/tests/baselines/reference/templateLiteralTypes1.errors.txt @@ -232,4 +232,13 @@ tests/cases/conformance/types/literal/templateLiteralTypes1.ts(205,16): error TS type T100000 = [...TDigits, ...TDigits, ...TDigits, ...TDigits, ...TDigits]; // Error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! error TS2590: Expression produces a union type that is too complex to represent. + + // Repro from #40863 + + type IsNegative = `${T}` extends `-${string}` ? true : false; + + type AA = + [true, true] extends [IsNegative, IsNegative] ? 'Every thing is ok!' : ['strange', IsNegative, IsNegative]; + + type BB = AA<-2, -2>; \ No newline at end of file diff --git a/tests/baselines/reference/templateLiteralTypes1.js b/tests/baselines/reference/templateLiteralTypes1.js index 1b28a658d44..8266f6c50f0 100644 --- a/tests/baselines/reference/templateLiteralTypes1.js +++ b/tests/baselines/reference/templateLiteralTypes1.js @@ -204,6 +204,15 @@ type D100000 = `${Digits}${Digits}${Digits}${Digits}${Digits}`; // Error type TDigits = [0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9]; type T100000 = [...TDigits, ...TDigits, ...TDigits, ...TDigits, ...TDigits]; // Error + +// Repro from #40863 + +type IsNegative = `${T}` extends `-${string}` ? true : false; + +type AA = + [true, true] extends [IsNegative, IsNegative] ? 'Every thing is ok!' : ['strange', IsNegative, IsNegative]; + +type BB = AA<-2, -2>; //// [templateLiteralTypes1.js] @@ -453,3 +462,9 @@ declare type Digits = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; declare type D100000 = `${Digits}${Digits}${Digits}${Digits}${Digits}`; declare type TDigits = [0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9]; declare type T100000 = [...TDigits, ...TDigits, ...TDigits, ...TDigits, ...TDigits]; +declare type IsNegative = `${T}` extends `-${string}` ? true : false; +declare type AA = [ + true, + true +] extends [IsNegative, IsNegative] ? 'Every thing is ok!' : ['strange', IsNegative, IsNegative]; +declare type BB = AA<-2, -2>; diff --git a/tests/baselines/reference/templateLiteralTypes1.symbols b/tests/baselines/reference/templateLiteralTypes1.symbols index 727638c918b..4c7162e1135 100644 --- a/tests/baselines/reference/templateLiteralTypes1.symbols +++ b/tests/baselines/reference/templateLiteralTypes1.symbols @@ -843,3 +843,29 @@ type T100000 = [...TDigits, ...TDigits, ...TDigits, ...TDigits, ...TDigits]; // >TDigits : Symbol(TDigits, Decl(templateLiteralTypes1.ts, 200, 63)) >TDigits : Symbol(TDigits, Decl(templateLiteralTypes1.ts, 200, 63)) +// Repro from #40863 + +type IsNegative = `${T}` extends `-${string}` ? true : false; +>IsNegative : Symbol(IsNegative, Decl(templateLiteralTypes1.ts, 204, 76)) +>T : Symbol(T, Decl(templateLiteralTypes1.ts, 208, 16)) +>T : Symbol(T, Decl(templateLiteralTypes1.ts, 208, 16)) + +type AA = +>AA : Symbol(AA, Decl(templateLiteralTypes1.ts, 208, 79)) +>T : Symbol(T, Decl(templateLiteralTypes1.ts, 210, 8)) +>Q : Symbol(Q, Decl(templateLiteralTypes1.ts, 210, 25)) + + [true, true] extends [IsNegative, IsNegative] ? 'Every thing is ok!' : ['strange', IsNegative, IsNegative]; +>IsNegative : Symbol(IsNegative, Decl(templateLiteralTypes1.ts, 204, 76)) +>T : Symbol(T, Decl(templateLiteralTypes1.ts, 210, 8)) +>IsNegative : Symbol(IsNegative, Decl(templateLiteralTypes1.ts, 204, 76)) +>Q : Symbol(Q, Decl(templateLiteralTypes1.ts, 210, 25)) +>IsNegative : Symbol(IsNegative, Decl(templateLiteralTypes1.ts, 204, 76)) +>T : Symbol(T, Decl(templateLiteralTypes1.ts, 210, 8)) +>IsNegative : Symbol(IsNegative, Decl(templateLiteralTypes1.ts, 204, 76)) +>Q : Symbol(Q, Decl(templateLiteralTypes1.ts, 210, 25)) + +type BB = AA<-2, -2>; +>BB : Symbol(BB, Decl(templateLiteralTypes1.ts, 211, 123)) +>AA : Symbol(AA, Decl(templateLiteralTypes1.ts, 208, 79)) + diff --git a/tests/baselines/reference/templateLiteralTypes1.types b/tests/baselines/reference/templateLiteralTypes1.types index fe1d45d0c75..687b03eb17b 100644 --- a/tests/baselines/reference/templateLiteralTypes1.types +++ b/tests/baselines/reference/templateLiteralTypes1.types @@ -515,3 +515,24 @@ type TDigits = [0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9]; type T100000 = [...TDigits, ...TDigits, ...TDigits, ...TDigits, ...TDigits]; // Error >T100000 : any +// Repro from #40863 + +type IsNegative = `${T}` extends `-${string}` ? true : false; +>IsNegative : IsNegative +>true : true +>false : false + +type AA = +>AA : AA + + [true, true] extends [IsNegative, IsNegative] ? 'Every thing is ok!' : ['strange', IsNegative, IsNegative]; +>true : true +>true : true + +type BB = AA<-2, -2>; +>BB : "Every thing is ok!" +>-2 : -2 +>2 : 2 +>-2 : -2 +>2 : 2 + diff --git a/tests/cases/conformance/types/literal/templateLiteralTypes1.ts b/tests/cases/conformance/types/literal/templateLiteralTypes1.ts index 08e467d980c..a708a47b3a1 100644 --- a/tests/cases/conformance/types/literal/templateLiteralTypes1.ts +++ b/tests/cases/conformance/types/literal/templateLiteralTypes1.ts @@ -206,3 +206,12 @@ type D100000 = `${Digits}${Digits}${Digits}${Digits}${Digits}`; // Error type TDigits = [0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9]; type T100000 = [...TDigits, ...TDigits, ...TDigits, ...TDigits, ...TDigits]; // Error + +// Repro from #40863 + +type IsNegative = `${T}` extends `-${string}` ? true : false; + +type AA = + [true, true] extends [IsNegative, IsNegative] ? 'Every thing is ok!' : ['strange', IsNegative, IsNegative]; + +type BB = AA<-2, -2>;