Microsoft/TypeScript

"Used before initialization" error false positives and negatives with optional properties

Open

#61.785 aperta il 30 mag 2025

Vedi su GitHub
 (1 commento) (0 reazioni) (1 assegnatario)TypeScript (6726 fork)batch import
BugDomain: check: Control FlowHelp Wanted

Metriche repository

Star
 (48.455 star)
Metriche merge PR
 (Merge medio 6g 17h) (9 PR mergiate in 30 g)

Descrizione

🔎 Search Terms

used before its initialization

🕗 Version & Regression Information

  • This changed between versions 4.2.3 and 4.3.5
  • This changed in commit or PR #43100 (0967f3b)

⏯ Playground Link

https://www.typescriptlang.org/play/?useDefineForClassFields=true&ts=5.8.3#code/MYGwhgzhAEDC0G8BQ1XTNAvNALgCwEsIA6AIwG4U1SB+ALmgDsBXAW1IFMAnLaARgBMAZkoBfJElCQYAEURVUYBi3bdoAH2jNGAEw4AzAow47KaaKV74ixDNkEik4oA

💻 Code

class C {
    a = this.b;
    b?: number = 123;
}

class D {
    a: number | undefined;
    b = this.a = 123;
}

🙁 Actual behavior

When initializing C.a: no error.

When initializing D.b:

Property 'a' is used before its initialization. (2729)

🙂 Expected behavior

When initializing C.a:

Property 'b' is used before its initialization. (2729)

When initializing D.b: no error.

Additional information about the issue

Tried with both useDefineForClassFields set to true and false.

The behavior is as expected when switching the use of undefined and the "optional" ? modifier like this:

class C {
    a = this.b;
    b: number | undefined = 123;
}

class D {
    a?: number;
    b = this.a = 123;
}

#43100 seems to have taken a wrong approach. Instead of basing the decision to report an error on whether the ? modifier is present, it should be based on whether the property access is on the left-hand side of an assignment expression.

Guida contributor