Skip to content

Default values + destructuring confuses CFA  #12620

Closed

Description

@jwbay

TypeScript Version: 2.1.1 and nightly (2.2.0-dev.20161202)

Code

// A *self-contained* demonstration of the problem follows...
let node: {
    props: any;
};

const { props: { className = '' } = {} } = node;

if (className) {
    node.props.className = className.slice(0, 1); // error TS2339: Property 'slice' does not exist on type 'never'.
}

Expected behavior:
Code compiles without error as in TS 2.0.10

Actual behavior:
Error as commented.

Might be duplicate/related to #10065 and its linked issues somehow, but I'm not sure. Strict nullchecks is not enabled.

The following workarounds fix the error:

  1. Change const to let
  2. Use if typeof className === 'string' instead of if (className)
  3. Take out the default values from the destructuring pattern

Activity

  1. mhegazy commented on Dec 2, 2016

    @mhegazy
    Contributor

    className should be any really, and i think this is the issue. we give className the type from the intializer, and that is not correct, it should be typeof initializer | typeof node.props.className

  2. mhegazy commented on Dec 2, 2016

    @mhegazy
    Contributor

    here is an example to demostrate the issue:

    let node: {
        props: any;
    } = { props: { className: null } };
    
    const { props: { className = '' } = {} } = node;
    
    if (className)  // this should be a valid check, since className can be null.
  3. manojdcoder commented on Dec 8, 2016

    @manojdcoder

    Looks like issue I'm facing is similar,

    // default value for b can't be a string
    function call({a, b = "Xyz"}: { a: string, b?: number }) {
        alert(b);
    }
    
    call({
        a:'Hello'
    })
    
    call({
        a: 'Hello',
        b: 10
    })
    
  4. sandersn commented on Oct 4, 2017

    @sandersn
    Member

    Fix is up at #18955.

  5. locked and limited conversation to collaborators on Jun 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

BugA bug in TypeScriptFixedA PR has been merged for this issue

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions