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):
- Przypnij główną wersję TypeScript do 6.x – zapewnia to stabilne API, którego oczekują wszystkie narzędzia.
- Dodaj
@typescript/native-previewjako devDependency – pakiet ten zawiera binarkę tsgo do szybkiego sprawdzania typów w CI. - Uruchamiaj tsgo z flagą
--noEmitdo szybkich kontroli – waliduje ona typy, ale nie generuje plików wyjściowych. - Używaj klasycznego kompilatora
tscdo właściwych buildów –tscnadal 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-jestits-morph. Zostaną one opublikowane wkrótce po wydaniu wersji 7.1. - Konfiguracja CI – pamiętaj, aby po ustabilizowaniu się API zastąpić
tsgo --noEmitzwykłym wywołaniemtsc; 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.
