DEV Community

Pelle Wessman
Pelle Wessman

Posted on • Originally published at github.com

TypeScript 4.5 adds JSDoc template tag defaults

TypeScript 4.5, which is currently a release candidate, includes an exciting new feature for us types in js JSDoc users:

Defaults for template tags, microsoft/TypeScript#45483: @template [T=string]

I found this through when looking for a way to void T defaulting to any when no value was given in this code:

/** @template [T=undefined] */
class ErrorWithCause extends Error {
  /**
   * @param {string} message
   * @param {{ cause?: T }} [options]
   */
  constructor (message, { cause } = {}) {
    if (cause) {
      /** @type {T} */
      this.cause = cause;
    }
    // ...
  }
}
Enter fullscreen mode Exit fullscreen mode

Now it gets set to undefined when no value is provied and my type-coverage got closer to 100%.

And it properly compiles to:

export class ErrorWithCause<T = undefined> extends Error {
    constructor(message: string, { cause }?: {
        cause?: T;
    } | undefined);
    cause: T;
}
Enter fullscreen mode Exit fullscreen mode

I will push this new code to my pony-cause module very soon, just wanted to write this up first šŸ„³

Originally posted as a discussion in the types-in-js community:

Discussion (0)