Nowy kompilator TypeScript 7 oparty na języku Go, tsgo, powoduje już problemy w popularnych narzędziach programistycznych, takich jak ESLint, ts-jest i ts-morph. Problemy te będą się utrzymywać do czasu ustabilizowania się programistycznego API kompilatora w nadchodzącej wersji 7.1, co oznacza, że zespoły polegające na tych narzędziach powinny wstrzymać wszelkie plany aktualizacji.

Co zmieniło się w TypeScript 7

Wydanie to wprowadza tsgo, port sprawdzania typów napisany w Go, który zespół TypeScript roboczo nazwał Project Corsa. Dzięki przeniesieniu rdzenia z JavaScript na Go, kompilator może dostarczać buildy nawet dziesięciokrotnie szybciej, co przyciągnęło wczesnych użytkowników chcących skrócić czas trwania potoków CI o kilka minut.

Dlaczego narzędzia nie działają

Narzędzia współpracujące z TypeScript nie komunikują się bezpośrednio ze sprawdzaczem typów. Wywołują one zestaw wewnętrznych API, które udostępniają informacje o typach, diagnostykę oraz przechodzenie po drzewie AST. API te zostały przepisane pod tsgo i pozostają w fazie zmian aż do wersji 7.1. Skutkiem tego jest kaskada awarii i cichych błędów:

  • typescript-eslint – npm odmawia instalacji obok TypeScript 7; wymuszenie instalacji powoduje, że ESLint wyrzuca błąd TypeError.
  • ts-jest – próbuje wywoływać wewnętrzne metody, które nie istnieją już w wersji Go, co powoduje przerwanie transformacji plików testowych.
  • ts-morph – oczekuje stabilnego API do przechodzenia po strukturze kodu; przy obecnym API może zwracać błędne wyniki lub zawodzić bez ostrzeżenia.
  • Monorepo – tsgo pomija pewne parametry typów generycznych, co prowadzi do błędów typów pojawiających się tylko w dużych projektach wielopakietowych.

Każdy proces pracy (workflow), który łączy linting, testowanie w Jest lub analizę kodu z TypeScript 7, prawdopodobnie zakończy się błędnymi buildami.

Kogo to dotyczy

  • Zespoły front-endowe, które uruchamiają ESLint jako część każdego pull requesta.
  • Usługi back-endowe, które polegają na ts-jest w testach jednostkowych.
  • Biblioteki wykorzystujące ts-morph do generowania kodu lub dokumentacji.
  • Organizacje z konfiguracją monorepo, gdzie wnioskowanie o typach (type inference) jest już złożone.

Jeśli Twój potok CI zmienił kolor na czerwony po aktualizacji TypeScript, winowajcą jest prawdopodobnie jeden z powyższych elementów.

Bezpieczna ścieżka migracji do wersji 7.1

Najprostszym sposobem na zachowanie korzyści prędkościowych bez psucia narzędzi jest oddzielenie szybkiego etapu sprawdzania typów od właściwego procesu budowania (build):

  1. Przypnij główną wersję TypeScript do 6.x – zapewnia to stabilne API, którego oczekują wszystkie narzędzia.
  2. Dodaj @typescript/native-preview jako devDependency – pakiet ten zawiera binarkę tsgo do szybkiego sprawdzania typów w CI.
  3. Uruchamiaj tsgo z flagą --noEmit do szybkich kontroli – waliduje ona typy, ale nie generuje plików wyjściowych.
  4. Używaj klasycznego kompilatora tsc do właściwych buildówtsc nadal generuje JavaScript i przestrzega API wersji 6.x.
npm install -D typescript@^6.9
npm install -D @typescript/native-preview

Zaktualizuj skrypty w swoim package.json:

{
  "scripts": {
    "typecheck:fast": "tsgo --noEmit",
    "build": "tsc"
  }
}

Dzięki tej podwójnej konfiguracji zachowasz dziesięciokrotny wzrost prędkości w CI, jednocześnie utrzymując kompatybilność z ESLint, ts-jest i ts-morph.

Kiedy możesz przejść bezpośrednio na wersję 7.0

Jeśli Twoja baza kodu wywołuje wyłącznie tsc — bez lintingu, bez Jest i bez ts-morph — to niestabilne API Cię nie dotyczy. W tym wąskim scenariuszu możesz natychmiast przejść na TypeScript 7 i cieszyć się wzrostem wydajności bez dodatkowych kroków.

Na co zwrócić uwagę

  • Wersja 7.1 – zespół TypeScript zasygnalizował, że programistyczne API zostanie zamrożone w tym wydaniu. Gdy tylko się pojawi, most między tsgo a istniejącymi narzędziami zniknie, co umożliwi czystą aktualizację.
  • Aktualizacje narzędzi – śledź nowe wersje typescript-eslint, ts-jest i ts-morph. Zostaną one opublikowane wkrótce po wydaniu wersji 7.1.
  • Konfiguracja CI – pamiętaj, aby po ustabilizowaniu się API zastąpić tsgo --noEmit zwykłym wywołaniem tsc; pakiet preview nie będzie już potrzebny.

Podsumowanie: Do czasu zamrożenia API w wersji 7.1 pozostań przy TypeScript 6.x jako głównym kompilatorze, dodaj @typescript/native-preview do szybkich kontroli i nadal używaj tsc do budowania projektów. Pozwoli to uniknąć problemów z lintingiem i testowaniem, jednocześnie korzystając z korzyści wydajnościowych nowego silnika Go.