tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(7,4): error TS2345: Argument of type '[number, string, string[][]]' is not assignable to parameter of type '[number, number, string[][]]'.
  Types of property '1' are incompatible.
    Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(7,29): error TS1005: ',' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(8,4): error TS2345: Argument of type '[number, number, string[][], string]' is not assignable to parameter of type '[number, number, string[][]]'.
  Types of property 'pop' are incompatible.
    Type '() => number | string[][] | string' is not assignable to type '() => number | string[][]'.
      Type 'number | string[][] | string' is not assignable to type 'number | string[][]'.
        Type 'string' is not assignable to type 'number | string[][]'.
          Type 'string' is not assignable to type 'string[][]'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(16,8): error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(16,16): error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(23,14): error TS2345: Argument of type '{ x: string; y: boolean; }' is not assignable to parameter of type '{ x: number; y: any; }'.
  Types of property 'x' are incompatible.
    Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(30,14): error TS2300: Duplicate identifier 'z'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(30,18): error TS2300: Duplicate identifier 'z'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(34,4): error TS2345: Argument of type '{ z: number; }' is not assignable to parameter of type '{ z: { x: any; y: { j: any; }; }; }'.
  Types of property 'z' are incompatible.
    Type 'number' is not assignable to type '{ x: any; y: { j: any; }; }'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(35,4): error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
  Property 'z' is missing in type '{}'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(36,4): error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z: number; }'.
  Types of property 'z' are incompatible.
    Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(37,4): error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z?: number; }'.
  Types of property 'z' are incompatible.
    Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(38,4): error TS2345: Argument of type '{ b: boolean; }' is not assignable to parameter of type '{ b: number | string; }'.
  Types of property 'b' are incompatible.
    Type 'boolean' is not assignable to type 'number | string'.
      Type 'boolean' is not assignable to type 'string'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(39,4): error TS2345: Argument of type '[number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
  Types of property '2' are incompatible.
    Type 'boolean' is not assignable to type '[[any]]'.
      Property '0' is missing in type 'Boolean'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(40,4): error TS2345: Argument of type '[number, number, [[string]]]' is not assignable to parameter of type '[any, any, [[number]]]'.
  Types of property '2' are incompatible.
    Type '[[string]]' is not assignable to type '[[number]]'.
      Types of property '0' are incompatible.
        Type '[string]' is not assignable to type '[number]'.
          Types of property '0' are incompatible.
            Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(46,13): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(47,13): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(55,7): error TS2420: Class 'C4' incorrectly implements interface 'F2'.
  Types of property 'd4' are incompatible.
    Type '({x, y, c}: { x: any; y: any; c: any; }) => void' is not assignable to type '({x, y, z}?: { x: any; y: any; z: any; }) => any'.
      Types of parameters '__0' and '__0' are incompatible.
        Type '{ x: any; y: any; c: any; }' is not assignable to type '{ x: any; y: any; z: any; }'.
          Property 'z' is missing in type '{ x: any; y: any; c: any; }'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(56,8): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(65,18): error TS2300: Duplicate identifier 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(65,26): error TS2300: Duplicate identifier 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(65,34): error TS2300: Duplicate identifier 'number'.


==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts (22 errors) ====
    // A parameter declaration may specify either an identifier or a binding pattern.
    // The identifiers specified in parameter declarations and binding patterns
    // in a parameter list must be unique within that parameter list.
    
    // If the declaration includes a type annotation, the parameter is of that type
    function a0([a, b, [[c]]]: [number, number, string[][]]) { }
    a0([1, "string", [["world"]]);      // Error
       ~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, string, string[][]]' is not assignable to parameter of type '[number, number, string[][]]'.
!!! error TS2345:   Types of property '1' are incompatible.
!!! error TS2345:     Type 'string' is not assignable to type 'number'.
                                ~
!!! error TS1005: ',' expected.
    a0([1, 2, [["world"]], "string"]);  // Error
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, string[][], string]' is not assignable to parameter of type '[number, number, string[][]]'.
!!! error TS2345:   Types of property 'pop' are incompatible.
!!! error TS2345:     Type '() => number | string[][] | string' is not assignable to type '() => number | string[][]'.
!!! error TS2345:       Type 'number | string[][] | string' is not assignable to type 'number | string[][]'.
!!! error TS2345:         Type 'string' is not assignable to type 'number | string[][]'.
!!! error TS2345:           Type 'string' is not assignable to type 'string[][]'.
    
    
    // If the declaration includes an initializer expression (which is permitted only
    // when the parameter list occurs in conjunction with a function body),
    // the parameter type is the widened form (section 3.11) of the type of the initializer expression.
    
    interface F1 {
        b0(z = 10, [[a, b], d, {u}] = [[1, 2], "string", { u: false }]);  // Error, no function body
           ~~~~~~
!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
    }
    
    function b1(z = null, o = { x: 0, y: undefined }) { }
    function b2([a, z, y] = [undefined, null, undefined]) { }
    function b3([[a], b, [[c, d]]] = [[undefined], undefined, [[undefined, undefined]]]) { }
    
    b1("string", { x: "string", y: true });  // Error
                 ~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '{ x: string; y: boolean; }' is not assignable to parameter of type '{ x: number; y: any; }'.
!!! error TS2345:   Types of property 'x' are incompatible.
!!! error TS2345:     Type 'string' is not assignable to type 'number'.
    
    // If the declaration specifies a binding pattern, the parameter type is the implied type of that binding pattern (section 5.1.3)
    function c0({z: {x, y: {j}}}) { }
    function c1({z} = { z: 10 }) { }
    function c2({z = 10}) { }
    function c3({b}: { b: number|string } = { b: "hello" }) { }
    function c4([z], z: number) { }  // Error Duplicate identifier
                 ~
!!! error TS2300: Duplicate identifier 'z'.
                     ~
!!! error TS2300: Duplicate identifier 'z'.
    function c5([a, b, [[c]]]) { }
    function c6([a, b, [[c = 1]]]) { }
    
    c0({ z: 1 });      // Error, implied type is { z: {x: any, y: {j: any}} }
       ~~~~~~~~
!!! error TS2345: Argument of type '{ z: number; }' is not assignable to parameter of type '{ z: { x: any; y: { j: any; }; }; }'.
!!! error TS2345:   Types of property 'z' are incompatible.
!!! error TS2345:     Type 'number' is not assignable to type '{ x: any; y: { j: any; }; }'.
    c1({});            // Error, implied type is {z:number}?
       ~~
!!! error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
!!! error TS2345:   Property 'z' is missing in type '{}'.
    c1({ z: true });   // Error, implied type is {z:number}?
       ~~~~~~~~~~~
!!! error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z: number; }'.
!!! error TS2345:   Types of property 'z' are incompatible.
!!! error TS2345:     Type 'boolean' is not assignable to type 'number'.
    c2({ z: false });  // Error, implied type is {z?: number}
       ~~~~~~~~~~~~
!!! error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z?: number; }'.
!!! error TS2345:   Types of property 'z' are incompatible.
!!! error TS2345:     Type 'boolean' is not assignable to type 'number'.
    c3({ b: true });   // Error, implied type is { b: number|string }. 
       ~~~~~~~~~~~
!!! error TS2345: Argument of type '{ b: boolean; }' is not assignable to parameter of type '{ b: number | string; }'.
!!! error TS2345:   Types of property 'b' are incompatible.
!!! error TS2345:     Type 'boolean' is not assignable to type 'number | string'.
!!! error TS2345:       Type 'boolean' is not assignable to type 'string'.
    c5([1, 2, false, true]);   // Error, implied type is [any, any, [[any]]]
       ~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
!!! error TS2345:   Types of property '2' are incompatible.
!!! error TS2345:     Type 'boolean' is not assignable to type '[[any]]'.
!!! error TS2345:       Property '0' is missing in type 'Boolean'.
    c6([1, 2, [["string"]]]);  // Error, implied type is [any, any, [[number]]]  // Use initializer
       ~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, [[string]]]' is not assignable to parameter of type '[any, any, [[number]]]'.
!!! error TS2345:   Types of property '2' are incompatible.
!!! error TS2345:     Type '[[string]]' is not assignable to type '[[number]]'.
!!! error TS2345:       Types of property '0' are incompatible.
!!! error TS2345:         Type '[string]' is not assignable to type '[number]'.
!!! error TS2345:           Types of property '0' are incompatible.
!!! error TS2345:             Type 'string' is not assignable to type 'number'.
    
    // A parameter can be marked optional by following its name or binding pattern with a question mark (?)
    // or by including an initializer.  Initializers (including binding property or element initializers) are
    // permitted only when the parameter list occurs in conjunction with a function body
    
    function d1([a, b, c]?) { }  // Error, binding pattern can't be optional in implementation signature
                ~~~~~~~~~~
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
    function d2({x, y, z}?) { }  // Error, binding pattern can't be optional in implementation signature
                ~~~~~~~~~~
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
    
    interface F2 {
        d3([a, b, c]?);
        d4({x, y, z}?);
        e0([a, b, c]);
    }
    
    class C4 implements F2 {
          ~~
!!! error TS2420: Class 'C4' incorrectly implements interface 'F2'.
!!! error TS2420:   Types of property 'd4' are incompatible.
!!! error TS2420:     Type '({x, y, c}: { x: any; y: any; c: any; }) => void' is not assignable to type '({x, y, z}?: { x: any; y: any; z: any; }) => any'.
!!! error TS2420:       Types of parameters '__0' and '__0' are incompatible.
!!! error TS2420:         Type '{ x: any; y: any; c: any; }' is not assignable to type '{ x: any; y: any; z: any; }'.
!!! error TS2420:           Property 'z' is missing in type '{ x: any; y: any; c: any; }'.
        d3([a, b, c]?) { }  // Error, binding pattern can't be optional in implementation signature
           ~~~~~~~~~~
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
        d4({x, y, c}) { }
        e0([a, b, q]) { }
    }
    
    // Destructuring parameter declarations do not permit type annotations on the individual binding patterns,
    // as such annotations would conflict with the already established meaning of colons in object literals.
    // Type annotations must instead be written on the top- level parameter declaration
    
    function e0({x: [number, number, number]}) { }  // error, duplicate identifier;
                     ~~~~~~
!!! error TS2300: Duplicate identifier 'number'.
                             ~~~~~~
!!! error TS2300: Duplicate identifier 'number'.
                                     ~~~~~~
!!! error TS2300: Duplicate identifier 'number'.
    
    
    