TypeScript 7.0 перахоўвае кампайляр на Go для адпаведнай швальнасці.
TypeScript 7.0 перэносіць tsc у Go з паралельнымі пераглядачамі, новымі стандартнымі настройкамі tsconfig, шаблоннымі літэраламі Unicode, стрэльнейшай аналізайом коду на JS, а таксама тымчасовым прыводам у програмнай API.
Прыблызна чатырнацца гадоў кампайляр TypeScript могаў сам сабе стварыць. tsc быў версіяй TypeScript, якая кампайлявалася у JavaScript і працавала на Node. Колі колькасць коду ў рэпозытарыях вырасла да мільйоноў лінак, такі спосаб працы стаў вузкам местам.
У TypeScript 7.0 зменілася мова-хост. Кампайляр і служба обработкі мовы перашлі з TypeScript у Go. Microsoft апісвае гэтыя змены як перэнесенне, а не перапісву: структура перакантролювання тыпаў застаецца такой жа, як у версіі 6.0, але выконанне выкалываецца як натыўны код з паралельнай працэю за дапамогою спяльванага памяці. У публікуемых порэваннях часта фіксуецца прыблызна 10× паўтарэнне скорасці у пораўнанні з TypeScript 6.0.
Адны з часта цітаваных прыкладоў паказвае, насколькі рэальныя ўлучанні. Перакантролюванне коду ў VS Code — прыблызна 1,5 мільйона лінакаў TypeScript — зменілася з прыблызна 77,8 секунд на адпаведны час прыблызна 7,5 секунд.
Якшча ранейшыя публікацыі вжывалі кодавое назва Project Corsa (дзе старыя дрэвы JavaScript мелі прозвішча Strada), то гэты выпуск — яго фінальная версія.
Чаму самэў Go, і чаму пераклад у іншы язык?
У гласных думках часта называлі Rust. Выбралі Go, таму што ён падходзіў па структуры да існуючага кампайляра: моцныя графы, сборчык сметлівасці і цыклічныя структуры, якія важка адтворыць з нуля. Гэта сумяшанне парадоксальнаў можлівасць лінія-за-лініяю перакладу.
Фармат перакладу мае большое значэнне, чым сам язык. Зберагчы архітэктуру, мы застаўілі правіла. Праекты, якія ужо пераглядаюць тыпы пад версіяй 6.0 з увёмканым stableTypeOrdering і без ignoreDeprecations, должны атрымаць тыя ж рэзультаты пад версіяй 7.0 — проста швэдзейшы двайнок, а не іншая сістэма тыпаў.
Спачатку быў адаптаваны тэсты працы сістэмы пад час вырабаткі. За больш адзін год порт працаваў на велікіх сістэмах у такіх сервісах, як Bloomberg, Figma, Google, Slack, Notion і Vercel, прычаму да гэтага этапу.
Праўія паралелізацыя
Раней пропускна здатнасць была обмежана адной нейтварнай задачай Node. Натыўныя працоўнікі усунулі гэтае обмежэння. У версіі 7 праца па аналізу, перакантроле і выдачы дадзеных стала распадацца на часткі, а таксама былі даданы флагі:
--checkersзадае колькісць паралельных працоўнікаў для перакантроле тыпаў--buildersпаралелізуе працэсы стварэння праектаў і стакоў у монорэпозітарыях разам з--checkers--singleThreadedз’едынае всю працу ў аднам ядрэ для дэбагу і вызначэння базовых часоў
Праца па аналізу/выдачы дадзеных за кожны файл залежыць ад размеру рэпазітарыя і ступеня модулярнасці; маленькія прыложэння з адным файлам отрымаюць меншы эфект.
Рэжым аблявання таксама быў перабудаваны. Апыткі збору даных спрацоўвалі CPU ў вельмі большых дрэвах node_modules; выкарыстоўванне механізма аблявання Parcel у языку Go зменшае гэтыя вітраты і дазволяе быстрэй рэагаваць на змяны.
Змены ў налашчаннях, якія створуюць проблемы для команд
TypeScript 6.0 служыў мостам: новыя стандартныя налашчанні і забойваныя функцыі паказваліся як апавешчэння. 7.0 ператварае іх у серьязныя бяды. Команды, якія ужо перайшлі на 6.0, зробілі большую частку работы. Перэхад з 5.x адразу на 7.0 вымагае часу на практычную налаштовку tsconfig.json.
Серьязныя змены стандартных налашчанняў:
strictўвімкнуты, калі толькі не змененыmoduleналаштаваны наesnext, тады якtargetвыбірае найновейшую стабільную версію ECMAScript, якая не ўключаеesnextnoUncheckedSideEffectImportsўвімкнуты за замовчаннямlibReplacementвыключаны за замовчанням
stableTypeOrdering застаецца актываўным.rootDir пачынаецца з ./.types пачынаецца як порожняй спіс.У дасведчэннях rootDir і types называюцца тымі элементамі, з якімаі команды сталкнуцца першыя — і тымі, якія лёгкая ў выправленні.
Калі tsconfig.json знаходзіцца вышэй за папку src, явна задаце rootDir, каб структура выходных дакументаў засталая звычайной:
{
"compilerOptions": {
"rootDir": "./src"
},
"include": ["./src"]
}
Паколькі types больш не автаматычна імпортуе все, што знаходзіцца пад node_modules/@types, указаце тое, што вам патрэбна:
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
Параметры, якія раней толькі паветарылі, цяпер спрачынаюць серйозныя проблемы (яны перастаюць выканаць які-лебе корыстныя задачы):
- Адмініструйце
target: es5іdownlevelIteration.
moduleResolution (node, node10, classic) на nodenext або bundlermodule, такія як amd, umd, systemjs і none, і заменіце іх на esnext або preservebaseUrl і задаўце paths абсалютна ўжо да корню праектуesModuleInterop / allowSyntheticDefaultImports на falsealwaysStrict быў увесь час уваўлечаныЯкшча пасля гадоў без перагледу параметр moduleResolution яшчэ застаецца на старым значэнні node, то гэты файл ёсць спісам пунктав для міграцыі.
Unicode у тыпах з літэраламі шаблона
Тэперыць тыпы шаблонных літэралав адпавядаюць код-пунктам Unicode, а не код-едыніцам UTF-16:
type HeadTail<S> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;
type Result = HeadTail<"😀abc">;
// In 7.0: ["😀", "abc"]
// Previously: ["\ud83d", "\ude00abc"]
Старэйшыя кампайляры моглі розбіваць пару заместнікаў эмодзі. Гэта падражнала спосаб адчыслення індэксаў у JS і рэдка падтрымвала намеры аўтара. Цяпер ітэрацыя адбываецца па код-пунктам, як і у for...of і [...str]. Інструменты, якія намеравана лічылі UTF-16 едыніцы, будуць нефункцыйнальныя; усе іншыя будуць атрымляць тое поведзенне, якого чакалі.
Строгейшая аналіза JavaScript
Праблемы пераказу .js раней падтрымвалі больш JSDoc і ідыомы перыяду Closure. Выпуск 7 праглыбляе гэты крок у напрамку правілаў .ts:
- Месцы, якім патрэбныя тыпы, адхоўляюць простыя значэнні — лепш выкарыстоўваць
typeof someValue @enum/@classтыятрэць спецыяльнага адносу; трэба заявіць рэальны клас або выкарыстоўваць@typedef- Просты
?не прыймаецца як тып — лепш выкарыстоўвацьany
!, не падтрымваны — трэба явна запісваць Tfunction(string): void заменяюцца на (s: string) => voidПрасоць у програмнай API
У версіі 7.0 яшчэ не ёсць стабільнай програмнай API. Таму бібліятэкі, якія включаюць кампайляр — інтэграцыя ESLint з TypeScript, ts-morph, ручнае стварэнне трансформероў, а таксама дапаможнікі для рэдагування шаблонаў у Vue, Svelte, Astro, MDX чыя Angular — яшчэ не можу цалком перайсці на новую структуру. Microsoft адносіцца да гэтага прасоцу як да тымчасовага і плануе завершыць распрацоўку API у версіі 7.1 і пасляеўных выданнях.
Тым часам, выкорыстоўваюце версію 7.0 там, дзе не патрэбны плагіні language-server. Команды Angular, напрыклад, можаць запускаць tsc з версіі 7.0 для шырокага адзначэння проблем у праекце за дапамою CLI, адначасова заставаючы версію 6.0 у рэдагары. Пакет для сумеснасці @typescript/typescript6 апранае бінарны файл tsc6 і занову выклікае API версіі 6.0, тады яны можаць сусістаць адночасова:
{
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.0"
}
}
Чы гэта трэба апдэйтаваць?
Калі вы вжо на TypeScript 6.0, міграцыя ўскоранае і дае вялікую выгоду: пасля налаштавання калька tsconfig вы атрымаеце шырэйшыя пераканальнікі CI і быстрэйшы старт рэдагара. У болей старых версіях існуюць справжнія проблемы з сумеснасцю, але практычна ўсія з іх ужо былі аанунцаваны.
Заўважкайце кандыдата на выпуск сёньня:
npm install -D typescript@rc
Для рэдагароў сёньня дадатак VS Code падтрымлівае LSP, а інтэграцыя з самім VS Code расшырваецца. Visual Studio выклікае версію 7.0 у адкрытым працоўным месца без додатковага крока інсталляцыі.
Адміністратары кажу, што выпускі новых функцыйяў знова будуць адбывацца за звычным мнагамесячным рытмам, і прыпускаецца, што версія 7.1 заполні цю прасоўку ў API для вбудоввання.
Аб’ектыўны рэзультат: звычныя правілы TypeScript, якія працуюць як натыўны код.