Галоўная / Артыкулы

TypeScript 7.0 перахоўвае кампайляр на Go для адпаведнай швальнасці.

TypeScript 7.0 перэносіць tsc у Go з паралельнымі пераглядачамі, новымі стандартнымі настройкамі tsconfig, шаблоннымі літэраламі Unicode, стрэльнейшай аналізайом коду на JS, а таксама тымчасовым прыводам у програмнай API.

Выдавец: REACTAPP.TOP5 хв чытання1086 слоў

Крыніцы: TypeScript 7.0 Is Here And It’s Written in Go

Прыблызна чатырнацца гадоў кампайляр 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, якая не ўключае esnext
  • noUncheckedSideEffectImports ўвімкнуты за замовчанням
  • 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 або bundler
  • Зняце рэжымы module, такія як amd, umd, systemjs і none, і заменіце іх на esnext або preserve
  • Адыянуце параметр baseUrl і задаўце paths абсалютна ўжо да корню праекту
  • Не зменяйце значэння esModuleInterop / allowSyntheticDefaultImports на false
  • Спрыяйце таму, каб параметр alwaysStrict быў увесь час уваўлечаны
  • Якшча пасля гадоў без перагледу параметр 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
  • Асэрцыі, якія заканчваюцца !, не падтрымваны — трэба явна запісваць T
  • Старыя фарматы function(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, якія працуюць як натыўны код.