Skip to content

Possible Regression in v4.9: Conditionals using Unlisted Property Narrowing with the in Operator Β #52812

Closed
@mattkrick

Description

@mattkrick

Bug Report

πŸ”Ž Search Terms

v4.9 conditionals unlisted property narrowing in operator #50666

πŸ•— Version & Regression Information

v4.9+, including nightly
working in v4.8.4

  • This changed between versions 4.8.4 and 4.9

⏯ Playground Link

Playground link with relevant code

πŸ’» Code

type HandledResult = {data: any, errors?: any}
type UnhandledResult = {message: string} 
const result = null as any as HandledResult | UnhandledResult

const noWork = (): HandledResult => {    
    if ('data' in result || 'errors' in result) return result // when checking an optional property second, I get an error 
    return {data: null, errors: [result.message]}
}

const work = (): HandledResult => {
    if ('errors' in result || 'data' in result ) return result // reversing the order fixes the problem
    return {data: null, errors: [result.message]}
}

πŸ™ Actual behavior

In the noWork function, typescript could not narrow down the type to being HandledResult. When the or clause is switched, it works. Since Boolean(A || B) === Boolean(B || A) this seems like an error.

πŸ™‚ Expected behavior

The ordering of the conditionals should not impact the narrowing of the type.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Not a DefectThis behavior is one of several equally-correct options

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions