The TypeScript team announces the release of TypeScript 3.4, including faster incremental builds, improvements for higher order type inference of generic functions, and support for ES.Next globalThis
.
Over the past few years, the TypeScript team have substantially improved the efficiency and ergonomics in expressing and inferring type definitions. The latest improvement in TypeScript 3.4 allows functions to infer types from other generic functions. Before this release, generic functions struggled to infer type when other generic functions get passed, as their arguments and type information gets lost. As explained by TypeScript program manager Daniel Rosenwasser:
During type argument inference for a call to a generic function that returns a function type, TypeScript will, as appropriate, propagate type parameters from generic function arguments onto the resulting function type.
TypeScript 3.4 also improves the experience when working with read-only array-like types. Previously, a type of ReadonlyArray
was required, but this blocks usage of the more common []
shorthand syntax during array definition. Now a readonly
modifier gets provided before the array, e.g. readonly string[]
to define a readonly
array where each item is a string. Tuples also can use the readonly
modifier, e.g. readonly [string, number]
.
Earlier versions of TypeScript mapped types such as the Readonly
utility type did not function on array and tuple types. In TypeScript 3.4, when using the readonly
modifier on a mapped type, TypeScript automatically converts array-like types to their readonly
analogs.
When developers declare mutable variables or properties, TypeScript typically widens values allowing for value assignment without defining an explicit type. The challenge, as explained by Rosenwasser:
JavaScript properties are mutable by default. This means that the language will often widen types undesirably, requiring explicit types in certain places. To solve this, TypeScript 3.4 introduces a new construct for literal values called
const
assertions. Its syntax is a type assertion withconst
in place of the type name (e.g.123 as const
).
New literal expressions with const
assertions allow TypeScript to signal that no literal types in that expression should have their type definition widened, object literals receive readonly
properties, and array literals become readonly
tuples.
One of the long-awaited additions to JavaScript is a standard for referencing the global context. Due to existing implementations with various libraries, it has taken several years to decide on a solution. TC39, the group, and process for defining future additions to JavaScript have settled on globalThis
which has now reached stage 3 support, the level at which the TypeScript waits before adding new features. globalThis
provides a global context regardless of the environment in which an application exists.
To leverage globalThis
, most applications today will need to use a globalThis
polyfill to support older browsers and JavaScript engines. One result of this change is that the type of top-level this
is now typed as typeof globalThis
instead of any
when working in the noImplicitAny
mode of TypeScript. Developers wishing to avoid this change may use the noImplicitThis
flag until they have time to update their usage of the global context.
To improve compilation times with TypeScript, TypeScript 3.4 adds a new --incremental
flag which saves project graph information from the last compilation, which gets used to detect the fastest way to type-check and emit changes to a project, reducing subsequent compile times. Rosenwasser explains the performance improvement by exploring the build types of Visual Studio Code:
For a project the size of Visual Studio Code, TypeScript’s new
--incremental
flag was able to reduce subsequent build times down to approximately a fifth of the original.
TypeScript 3.4 has some potentially breaking changes, all of which are consequences of using the new features. For example, if a codebase does not expect the propagation of generic type arguments, then it will need updates to compile without errors when using TypeScript 3.4.
The TypeScript team is already working on features for TypeScript 3.5, including a move from TSLint to ESLint and several language and compiler improvements, including negated types.
The TypeScript community also announced the second TSConf event on October 11th, with TypeScript founder Anders Hejlsberg delivering the keynote.
TypeScript is open source software available under the Apache 2 license. Contributions and feedback are encouraged via the TypeScript GitHub project and should follow the TypeScript contribution guidelines and Microsoft open source code of conduct.