tests/cases/conformance/jsdoc/0.js(68,19): error TS2339: Property 'a' does not exist on type 'String'.
tests/cases/conformance/jsdoc/0.js(68,22): error TS2339: Property 'b' does not exist on type 'String'.
tests/cases/conformance/jsdoc/0.js(70,20): error TS8024: JSDoc '@param' tag has name 'y', but there is no parameter with that name.


==== tests/cases/conformance/jsdoc/0.js (3 errors) ====
    // Object literal syntax
    /**
     * @param {{a: string, b: string}} obj
     * @param {string} x
     */
    function good1({a, b}, x) {}
    /**
     * @param {{a: string, b: string}} obj
     * @param {{c: number, d: number}} OBJECTION
     */
    function good2({a, b}, {c, d}) {}
    /**
     * @param {number} x
     * @param {{a: string, b: string}} obj
     * @param {string} y
     */
    function good3(x, {a, b}, y) {}
    /**
     * @param {{a: string, b: string}} obj
     */
    function good4({a, b}) {}
    
    // nested object syntax
    /**
     * @param {Object} obj
     * @param {string} obj.a - this is like the saddest way to specify a type
     * @param {string} obj.b - but it sure does allow a lot of documentation
     * @param {string} x
     */
    function good5({a, b}, x) {}
    /**
     * @param {Object} obj
     * @param {string} obj.a
     * @param {string} obj.b - but it sure does allow a lot of documentation
     * @param {Object} OBJECTION - documentation here too
     * @param {string} OBJECTION.c
     * @param {string} OBJECTION.d - meh
     */
    function good6({a, b}, {c, d}) {}
    /**
     * @param {number} x
     * @param {Object} obj
     * @param {string} obj.a
     * @param {string} obj.b
     * @param {string} y
     */
    function good7(x, {a, b}, y) {}
    /**
     * @param {Object} obj
     * @param {string} obj.a
     * @param {string} obj.b
     */
    function good8({a, b}) {}
    
    /**
     * @param {{ a: string }} argument
     */
    function good9({ a }) {
        console.log(arguments, a);
    }
    
    /**
     * @param {object} obj - this type gets ignored
     * @param {string} obj.a
     * @param {string} obj.b - and x's type gets used for both parameters
     * @param {string} x
     */
    function bad1(x, {a, b}) {}
                      ~
!!! error TS2339: Property 'a' does not exist on type 'String'.
                         ~
!!! error TS2339: Property 'b' does not exist on type 'String'.
    /**
     * @param {string} y - here, y's type gets ignored but obj's is fine
                       ~
!!! error TS8024: JSDoc '@param' tag has name 'y', but there is no parameter with that name.
     * @param {{a: string, b: string}} obj
     */
    function bad2(x, {a, b}) {}
    