Skip to content

Using nullish coalescing with untyped field in constructor trigger TS7022 #55013

Open
@6XGate

Description

@6XGate

Bug Report

Using nullish coalescing in a constructor to initialize a class member with no type annotation will result in a TS7022 error.

🔎 Search Terms

nullish, coalescing, 7022, ??, and ts7022

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about nullish coalescing and type inference.

⏯ Playground Link

Playground link with relevant code

💻 Code

export class Node {
  #parent

  #children = new Children(this)

  constructor (parent?: Node | null | undefined) {
    // Remove `??` and the code after and the code compiled. Now #parent is undefined which is not desired.
    this.#parent = parent ?? null
  }

  get parent () { return this.#parent }

  get children () { return this.#children }
}

export class Children {
  #parent
  #head
  #tail

  constructor (parent: Node) {
    this.#parent = parent
    this.#head = new Node(parent)
    this.#tail = new Node(parent)
  }
}

🙁 Actual behavior

Attempting to compile the example code results in a TS7022 error: '#parent' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.

🙂 Expected behavior

The code should compile and #parent should be typed as Node | null.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Help WantedYou can do thisPossible ImprovementThe current behavior isn't wrong, but it's possible to see that it might be better in some cases

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions