microsoft / microsoft/TypeScript

Crash: RangeError: Invalid string length in addSpans during instantiation of recursive template literal types

Offen
#63,271 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Domain: Crashes
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

🔎 Search Terms

RangeError: Invalid string length

addSpans crash

getTemplateLiteralType recursion

Template literal exponential growth

🕗 Version & Regression Information

Crashes in: 5.7.3, 5.8.3, 5.9.3, Nightly.

⏯ Playground Link

https://www.typescriptlang.org/zh/play/?target=7&ts=6.0.0-dev.20260319#code/C4TwDgpgBAIhDGAeAclCAPYEB2ATAzlNgK4C2ARhAE4B8UAvFAFBStSoZZ6ECsUA-FAAsUAFzs0mHAWECoAZjETO0wosEAmJSzYcp3KFsEBDbCG1tl+mQEY5ABiX2A3EyahIUAEoJiVFJJcMiQU1AA0UADKgapQ+MBUAJbYAOZ0jDqsekGEjoLR4j7wfohwSMg0EQAGACQA3pEAvgD69U1VNK7u4NAAouhgADYA9rjQjHWZUADaAApQyd6+-jwRAETGa3TGhLV1sy0A1hAgVQC64qYgro3OQA

💻 Code
type Dec<N extends number> = 
    N extends 5 ? 4 : N extends 4 ? 3 : N extends 3 ? 2 : 
    N extends 2 ? any : 
    N extends 1 ? 0 : 0;

type Recur<N extends number, S extends string> = 
    N extends 0 ? S : Recur<Dec<N>, `${S}_${S}`>;

type Explode = {
    [P in Recur<5, "a"> as `${P}_key`]: any;
};
🙁 Actual behavior
node built/local/tsc.js -noEmit  specializedSignatureIsNotSubtypeOfNonSpecializedSignature_filled_1_unvalidated_mutated_batch12.ts
D:\github\TypeScript\built\local\_tsc.js:123721
      throw e;
      ^

RangeError: Invalid string length
    at addSpans (D:\github\TypeScript\built\local\_tsc.js:62120:19)
    at getTemplateLiteralType (D:\github\TypeScript\built\local\_tsc.js:62095:10)
    at instantiateTypeWorker (D:\github\TypeScript\built\local\_tsc.js:63780:14)
    at instantiateTypeWithAlias (D:\github\TypeScript\built\local\_tsc.js:63736:20)
    at instantiateType (D:\github\TypeScript\built\local\_tsc.js:63703:29)
    at getMappedType (D:\github\TypeScript\built\local\_tsc.js:63383:67)
    at D:\github\TypeScript\built\local\_tsc.js:62756:73
    at map (D:\github\TypeScript\built\local\_tsc.js:196:19)
    at canTailRecurse (D:\github\TypeScript\built\local\_tsc.js:62756:33)
    at getConditionalType (D:\github\TypeScript\built\local\_tsc.js:62723:17)

Node.js v22.19.0
🙂 Expected behavior

The compiler should not crash.

Additional information about the issue

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere den Absturz mit dem bereitgestellten rekursiven Template-Literal-Beispiel oder dem Befehl specializedSignatureIsNotSubtypeOfNonSpecializedSignature_filled_1_unvalidated_mutated_batch12.ts. Beginne bei addSpans und getTemplateLiteralType in built/local/tsc.js und verfolge den Stack über instantiateTypeWorker. Erledigt ist die Aufgabe, wenn der Compiler die Eingabe meldet oder verarbeitet, ohne RangeError: Invalid string length auszulösen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.