TypeScript 3.9 Ships with Faster Compile Times

Microsoft shipped TypeScript 3.9, quickening the compile times for the increasingly popular programming language used to write software ranging from Angular and Vue to Visual Studio Code.

"TypeScript 3.9 ships with many new speed improvements," said Daniel Rosenwasser, program manager, in a May 12 blog post. "Our team has been focusing on performance after observing extremely poor editing/compilation speed with packages like material-ui and styled-components. We've dived deep here, with a series of different pull requests that optimize certain pathological cases involving large unions, intersections, conditional types, and mapped types."

Rosenwasser cited six different pull requests for the open source project that delivered the above benefits:

  • Use objects instead of closures for type mappers #36576
  • Faster exit from isTypeRelatedTo with identityRelation #36590
  • Optimize deferred type references #36607
  • Cache results of isGenericObjectType and isGenericIndexType #36622
  • Avoid expensive relationship checking in mapped type member resolution #36754
  • Reduce intersections by discriminants #36696

In specific situations, each of the above was found to reduce compile times by 5 percent to 10 percent. The aforementioned material-ui-styles (which, as its name bespeaks, provides styles base on React's Material-UI design scheme -- even if its components aren't used) enjoyed a 25 percent reduced compile time. One Microsoft developer working on the Outlook Web App (according to his LinkedIn profile) tweeted a compile time for one of his projects shrank from 26 seconds to 10 seconds, "that's with ME doing NO work but upgrading."

Quicker Compile Time
[Click on image for larger view.] Quicker Compile Time (source: Twitter).

"We also have some changes to file renaming functionality in editor scenarios," Rosenwasser said. "We heard from the Visual Studio Code team that when renaming a file, just figuring out which import statements needed to be updated could take between 5 to 10 seconds. TypeScript 3.9 addresses this issue by changing the internals of how the compiler and language service caches file lookups. While there's still room for improvement, we hope this work translates to a snappier experience for everyone!"

Several editor improvements were also made in the TypeScript compiler (which itself is written in TypeScript). The compiler not only powers the TypeScript editing experience in major code editors but also JavaScript in the Visual Studio family of editors.

Editor improvements include:

  • CommonJS Auto-Imports in JavaScript: "TypeScript now automatically detects the types of imports you're using to keep your file's style clean and consistent."
  • Code Actions Preserve Newlines: TypeScript's refactorings and quick fixes often didn't preserve newlines in code. Now, "TypeScript 3.9 does a little more work to preserve what we write."
  • Quick Fixes for Missing Return Expressions: "Thanks to a pull request from community member Wenlu Wang, TypeScript can provide a quick-fix to add missing return statements, remove curly braces, or add parentheses to arrow function bodies that look suspiciously like object literals."
  • Support for "Solution Style" tsconfig.json Files: This fixed a problem in editors identifying which configuration files certain files belong to, specifically when a tsconfig.json file just existed to reference other tsconfig.json files, such as tsconfig.shared.json, tsconfig.frontend.json and tsconfig.backend.json. "This file that really does nothing but manage other project files is often called a 'solution' in some environments. Here, none of these tsconfig.*.json files get picked up by the server, but we'd really like the language server to understand that the current .ts file probably belongs to one of the mentioned projects in this root tsconfig.json.

    "TypeScript 3.9 adds support to editing scenarios for this configuration. For more details, take a look at the pull request that added this functionality."

As we reported in coverage of the release candidate that shipped just a week before the final release, other improvements include:

  • Improvements in Inference and Promise.all: A regression problem caused by updates to the declarations of functions like Promise.all and Promise.race has been fixed.
  • // @ts-expect-error Comments: "When a line is prefixed with a // @ts-expect-error comment, TypeScript will suppress that error from being reported; but if there's no error, TypeScript will report that // @ts-expect-error wasn't necessary."
  • Uncalled Function Checks in Conditional Expressions: A previously introduced feature, uncalled function checks, to report an error when a developer has forgotten to call a function, now works with ternary conditionals (the cond ? trueExpr : falseExpr syntax).

With TypeScript 3.9 out the door, developers can get a peek into what's coming up in the 4.0 iteration plan and the Feature Roadmap.

The TypeScript 4.0 beta is set for June 19, with the final release scheduled for Aug. 18.

The roadmap lists future items including:

Investigate error messages in haiku or iambic pentameter
[Click on image for larger view.] Investigate error messages in haiku or iambic pentameter (source: Twitter).

One item of particular interest to many developers -- "Investigate error messages in haiku or iambic pentameter" -- has been languishing since being introduced in March 2018. An investigation into the delay may be forthcoming.

About the Author

David Ramel is an editor and writer for Converge360.

comments powered by Disqus


  • Creating Reactive Applications in .NET

    In modern applications, data is being retrieved in asynchronous, real-time streams, as traditional pull requests where the clients asks for data from the server are becoming a thing of the past.

  • AI for GitHub Collaboration? Maybe Not So Much

    No doubt GitHub Copilot has been a boon for developers, but AI might not be the best tool for collaboration, according to developers weighing in on a recent social media post from the GitHub team.

  • Visual Studio 2022 Getting VS Code 'Command Palette' Equivalent

    As any Visual Studio Code user knows, the editor's command palette is a powerful tool for getting things done quickly, without having to navigate through menus and dialogs. Now, we learn how an equivalent is coming for Microsoft's flagship Visual Studio IDE, invoked by the same familiar Ctrl+Shift+P keyboard shortcut.

  • .NET 9 Preview 3: 'I've Been Waiting 9 Years for This API!'

    Microsoft's third preview of .NET 9 sees a lot of minor tweaks and fixes with no earth-shaking new functionality, but little things can be important to individual developers.

  • Data Anomaly Detection Using a Neural Autoencoder with C#

    Dr. James McCaffrey of Microsoft Research tackles the process of examining a set of source data to find data items that are different in some way from the majority of the source items.

Subscribe on YouTube