//// [tests/cases/conformance/es6/destructuring/destructuringControlFlow.ts] ////

//// [destructuringControlFlow.ts]
function f1(obj: { a?: string }) {
    if (obj.a) {
        obj = {};
        let a1 = obj["a"];  // string | undefined
        let a2 = obj.a;  // string | undefined
    }
}

function f2(obj: [number, string] | null[]) {
    let a0 = obj[0];  // number | null
    let a1 = obj[1];  // string | null
    let [b0, b1] = obj;
    ([a0, a1] = obj);
    if (obj[0] && obj[1]) {
        let c0 = obj[0];  // number
        let c1 = obj[1];  // string
        let [d0, d1] = obj;
        ([c0, c1] = obj);
    }
}

function f3(obj: { a?: number, b?: string }) {
    if (obj.a && obj.b) {
        let { a, b } = obj;  // number, string
        ({ a, b } = obj);
    }
}

function f4() {
    let x: boolean;
    ({ x } = 0);  // Error
    ({ ["x"]: x } = 0);  // Error
    ({ ["x" + ""]: x } = 0);  // Errpr
}

// Repro from #31770

type KeyValue = [string, string?];
let [key, value]: KeyValue = ["foo"];
value.toUpperCase();  // Error


//// [destructuringControlFlow.js]
"use strict";
function f1(obj) {
    if (obj.a) {
        obj = {};
        let a1 = obj["a"]; // string | undefined
        let a2 = obj.a; // string | undefined
    }
}
function f2(obj) {
    let a0 = obj[0]; // number | null
    let a1 = obj[1]; // string | null
    let [b0, b1] = obj;
    ([a0, a1] = obj);
    if (obj[0] && obj[1]) {
        let c0 = obj[0]; // number
        let c1 = obj[1]; // string
        let [d0, d1] = obj;
        ([c0, c1] = obj);
    }
}
function f3(obj) {
    if (obj.a && obj.b) {
        let { a, b } = obj; // number, string
        ({ a, b } = obj);
    }
}
function f4() {
    let x;
    ({ x } = 0); // Error
    ({ ["x"]: x } = 0); // Error
    ({ ["x" + ""]: x } = 0); // Errpr
}
let [key, value] = ["foo"];
value.toUpperCase(); // Error
