Microsoft/TypeScript

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

Open

#61 785 ouverte le 30 mai 2025

Voir sur GitHub
 (1 commentaire) (0 réactions) (1 assigné)TypeScript (6 726 forks)batch import
BugDomain: check: Control FlowHelp Wanted

Métriques du dépôt

Stars
 (48 455 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (9 PRs mergées en 30 j)

Description

🔎 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.

Guide contributeur