Skip to content

Cannot bracket-index into an object after checking it's existence on that object. #44117

Description

@h-joo

Bug Report

Cannot bracket-index into an object after checking it's existence on that object.

The same failure was reported in #43651, but I couldn't find a separate discussion or a ticket for this.

🔎 Search Terms

  • implicitly has an 'any' type
  • bracket indexing

🕗 Version & Regression Information

Worked in 4.2.4. Starts to break since 4.3.0-beta

⏯ Playground Link

Playground link

💻 Code

interfaceA{}functionfoo(a:A){if('abc'ina){constz=a;// Element implicitly has an 'any' type because expression of type '"abc"' can't be used to index type 'A'.// Property 'abc' does not exist on type 'A'.returnz['abc'];}}

🙁 Actual behavior

Compiler gives an error that you cannot index into type 'A', since 'abc' does not exist in type 'A'

🙂 Expected behavior

Compiler recognizes the existence check and does not give an error.

Observation

This seems to be caused by the improvement in the control flow analysis/type inference. Before the type of z in the below example was 'never' prior to TS4.3, but now the compiler recognizes z being type A

Question : I have one question though, is it by design that it's allowed to index into never types?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Breaking ChangeWould introduce errors in existing code

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions